-3

パスカルでは、ループに入る1から50までの数字をランダムに選択したいと思います。番号が選択されるたびに、その番号は削除され、最終的に1から50の間に選択する番号がなくなり、ループが終了します。

このようなことはPascal/Delphiでどのように行われますか?

4

1 に答える 1

5

これはかなり簡単でなければなりません。

  1. 1から50までの数字の配列から始めます
  2. 各反復で、1から配列の要素数までの乱数を選択します
  3. その要素を配列から取得します
  4. 配列に要素がなくなるまで、ステップ2に進みます。

コードでは、次のようになります。

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

const
  ARRAY_ELEMENTS = 50;

var
  SourceArray: array of Integer;
  Element: Integer;
  ValidElements: Integer;
begin
  Randomize;
  try
    //array initialization
    SetLength(SourceArray, ARRAY_ELEMENTS);
    for Element := Low(SourceArray) to High(SourceArray) do
      SourceArray[Element] := Element + 1;
    ValidElements := ARRAY_ELEMENTS;
    repeat
      //select a random element
      Element := Random(ValidElements);
      Writeln(SourceArray[Element]);
      //remove the element from the array
      SourceArray[Element] := SourceArray[ValidElements - 1];
      Dec(ValidElements);
    until ValidElements = 0;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.

コメントの後に編集して、最後の配列要素をポークされたものと交換することでパフォーマンスを向上させました。

リスト例

タグに気づかなかったので、リストの例を次に示します。

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Generics.Collections;

const
  LIST_ELEMENTS = 50;

var
  I: Integer;
  Element: Integer;
  SourceList: TList<Integer>;
begin
  Randomize;
  try
    SourceList := TList<Integer>.Create();
    try
      for I := 1 to LIST_ELEMENTS do
        SourceList.Add(I);
      repeat
        Element := Random(SourceList.Count);
        Writeln(SourceList[Element]);
        SourceList.Delete(Element);
      until SourceList.Count = 0;
    finally
      SourceList.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
于 2013-03-08T05:53:39.230 に答える