Registriert seit: 26. Mai 2004
3.159 Beiträge
|
AW: Effiziente Erzeugung, nicht gleicher Zufallszahlen
10. Mai 2011, 14:52
Hab hier mal den passenden Code dazu, in so fern das mal jemand anderer brauchen sollte. Habe die von himitsu genannte erste Technik verwendet, d.h. ein Array befüllt, dann durchgemixt -- zufällig versteht sich -- und dann die ersten Count Elemente ausgegeben.
Delphi-Quellcode:
function GetUniqueRandomNumbers(const Count, AFrom, ATo: Integer): TArray<Integer>; overload;
procedure Swap(var A: TArray<Integer>; const IndexA, IndexB: Integer);
var
Tmp : Integer;
begin
Tmp := A[IndexA];
A[IndexA] := A[IndexB];
A[IndexB] := Tmp;
end;
var
Values : TArray<Integer>;
L : Integer;
i : Integer;
begin
if (Count < 1) then
SetLength(Result, 0)
else begin
if (ATo < AFrom) then
raise EArgumentException.CreateFmt('AFrom (%d) has to be smaller than ATo (%d).', [AFrom, ATo]);
L := ATo - AFrom + 1;
if (Count > L) then
raise EArgumentException.CreateFmt('Range from AFrom (%d) to ATo (%d) has to be greater than Count (%d).', [AFrom, ATo, Count]);
SetLength(Values, L);
for i := 0 to L - 1 do
Values[i] := AFrom + i;
Randomize();
for i := 0 to L - 1 do
Swap(Values, i, Random(L));
SetLength(Result, Count);
Move(Values[0], Result[0], Count * SizeOf(Integer));
end;
end;
function GetUniqueRandomNumbers(const Count, Range: Integer): TArray<Integer>; overload;
begin
Result := GetUniqueRandomNumbers(Count, 0, Range - 1);
end;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
Geändert von s.h.a.r.k (10. Mai 2011 um 15:11 Uhr)
|
|
Zitat
|