Ein Variante von mir, schafft auf meinem Rechner 3 Millionen Ziehungen von 6 aus 49 pro Sekunde.
Delphi-Quellcode:
const
CRLF = #13#10;
function Lottozahlen(Min, Max: Integer; Count: Word): TIntegerDynArray;
{---}
procedure Swap(
var Value1, Value2: Integer);
inline;
var
Temp: Integer;
begin
Temp := Value1;
Value1 := Value2;
Value2 := Temp;
end;
{---}
var
diff, i1, i2, r1, r2: Integer;
SortArray: TIntegerDynArray;
begin
diff := Max - Min + 1;
if diff < Count
then
raise Exception.Create(Format('
Ungültige Parameter' + CRLF +
'
Lottozahlen(%d, %d, %d)',
[Min, Max, Count]));
SetLength(Result, Count);
SetLength(SortArray, Count);
for i1 := 0
to Count - 1
do
begin
r1 := Random(diff) + Min;
r2 := r1;
for i2 := 0
to i1 - 1
do
begin
if (r1 = r2)
and (SortArray[i2] <= r2)
then
begin
Inc(r1);
Inc(r2);
end
else
Swap(r2, SortArray[i2]);
end;
Result[i1] := r1;
SortArray[i1] := r2;
Dec(diff);
end;
end;
Wenn die Ergebnisse sortiert sein dürften, sähe das noch etwas einfacher aus.