AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Effiziente Erzeugung, nicht gleicher Zufallszahlen

Ein Thema von s.h.a.r.k · begonnen am 10. Mai 2011 · letzter Beitrag vom 11. Mai 2011
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

AW: Effiziente Erzeugung, nicht gleicher Zufallszahlen

  Alt 10. Mai 2011, 13: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 14:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz