Auch, wenn das Thema ja schon fast erledigt ist, habe ich auch noch einen Vorschlag.
Die Prozedur "InitZufallsZahlen" füllt ein variables array mit den Zahlen eines bestimmten Bereichs. Über die Funktion "GetZufallsZahl" kann man sich dann Zufallszahlen nehmen bis das Array leer ist (Denn, wenn man sich eine holt, wird sie aus dem Array entfernt.). So ist sichergestellt, dass keine Zufallszahl doppelt vorkommt.
Delphi-Quellcode:
//==============================================================================
var ZufallsZahlen : array of Integer;
//==============================================================================
procedure InitZufallsZahlen(ErsteZahl, LetzteZahl: Integer);
var index : Integer;
begin
if LetzteZahl < ErsteZahl then Exit;
Randomize;
SetLength(ZufallsZahlen,LetzteZahl-ErsteZahl+1);
for index := 0 to Length(ZufallsZahlen)-1 do
ZufallsZahlen[index] := ErsteZahl + index;
end;
//==============================================================================
function GetZufallsZahl(var ZufallsZahl: Integer):Boolean;
var position : Integer;
index : Integer;
begin
if Length(ZufallsZahlen) > 0 then
begin
position := random(Length(ZufallsZahlen));
ZufallsZahl := ZufallsZahlen[position];
for index := position to Length(ZufallsZahlen)-2 do
ZufallsZahlen[index] := ZufallsZahlen[index+1];
SetLength(ZufallsZahlen,Length(ZufallsZahlen)-1);
result := True;
end
else
begin
ZufallsZahl := 0;
result := False;
end;
end;
//==============================================================================
Natürlich kann man auch meinen Vorschlag auf beliebige Typen ausweiten. man müsste nur folgendes ändern:
1.) Statt "array of integer" "Array of MEIN_TYP" schreiben
2.) Eine eigene InitZufallszahlen schreiben
3.) Bei der Funktion GetZufallsZahl den var-Paramter ändern.
overmoon