Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#66

Re: Zufallszahl ziehen ohne wiederholung

  Alt 17. Feb 2009, 11:51
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.
  Mit Zitat antworten Zitat