パスカルでは、ループに入る1から50までの数字をランダムに選択したいと思います。番号が選択されるたびに、その番号は削除され、最終的に1から50の間に選択する番号がなくなり、ループが終了します。
このようなことはPascal/Delphiでどのように行われますか?
これはかなり簡単でなければなりません。
コードでは、次のようになります。
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.