Q&A

  • 랜덤 함수 관련 질문입니다.
랜덤 함수를 쓰면은 임의의 값이 주어지잖아요..

근데.. 예를 들어 범위 1-100 까지의 랜덤 값을 100개 구할때..
(단, 100개는 모두 다른 정수)
어떻게 해야 되죠??

즉 1-100 까지의 범위 내에서 랜덤 정수 100개를 중복 없이 구해야 하는데 방법을 모르겠에요...

간단히 예를들면 1-5까지의 경우..

3 2 5 1 4 또는 2 5 1 4 3 등등 범위 내에서 전부 다른값이 나와야 된다는 겁니다.--;

고수님들 답변좀 부탁드립니다.--;
2  COMMENTS
  • Profile
    정정호 2002.04.14 17:25
    const MaxRand = 10;  // 최대 랜덤 갯수

    var
    Form1: TForm1;
    RandArray: array[1..MaxRand]of Char;

    implementation

    {$R *.DFM}

    function RandNum: Integer;
    var c: Integer;
    begin
    for c:= 1 to MaxRand do
       if RandArray[c] = #0 then Break;
    if c > MaxRand then
       Result:= 0 // 최대 랜덤갯수를 초과 하면 0을 리턴한다.
    else begin
       repeat
         Result:= Random(MaxRand) + 1;
       until RandArray[Result] = #0;
       RandArray[Result]:= #1;
    end;
    end;

    procedure ResetRand;
    begin
    FillChar(RandArray, SizeOf(RandArray), #0);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var c: Integer;
    begin
    ResetRand;  // 랜덤 초기화
    for c:= 1 to MaxRand do
       Memo1.Lines.Add(IntToStr(RandNum));
    end;

    // 전체 랜덤수를 간단하게 구하고 싶으면 아래와 같이 하면됩니다.  
    // 단 아래 소스는Max 랜덤갯수를 초과하면 무한루프에 빠집니다.

    procedure TForm1.Button2Click(Sender: TObject);
    const MaxCount = 10;
    var c: Integer;
       CheckRand: array[1..MaxCount]of Char;

    FUNCTION RandValue: Integer;
    begin
       repeat
         Result:= Random(MaxCount) + 1;
       until CheckRand[Result] = #0;
       CheckRand[Result]:= #1;
    end;

    begin
    FillChar(CheckRand, SizeOf(CheckRand), #0);
    for c:= 1 to MaxRand do
       Memo1.Lines.Add(IntToStr(RandNum));
    end;
  • Profile
    이명훈 2002.04.14 07:59
    안녕하세요..

    방법이야 많이 있습니다..

    저 같으면 이렇게 할거 같아요..

    1-100까지의 수를 배열에 넣습니다.( 예를 들어 A[1]:= 1..A[100]:=100 )

    그런다음 님이 원하는 수만큼의 루프를 발생돌려서 그 안에서 100까지의 랜덤

    한수를 2개 발생시킨 다음, 그 두수의 값의 인덱스를 서로 교환하는거에여..

    에구~~ 이해가 되실려나..
    var
      Temp, fA,fB: Integer;
       I,J             : Integer;
      A               : Array[1..100] of Integer;
    Begin
      For J:=1 to 100 do A[J]:= J;
      For I:=1 to 100 do
        Begin
          fA:= Random(100)+1;
          fB:= Random(100)+1;
          A[fA]:= Temp;
          A[fA]:= A[fB];
          A[fB]:= Temp;
        end;

    이런 식으루여...