Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism System.Random ... (https://www.delphipraxis.net/77607-system-random.html)

Steve9825679 21. Sep 2006 19:36


System.Random ...
 
Hallo,

ich programmiere unter Delphi 2006.
Mit der Funktion CreateID bastle ich mir eine 50stellige ID zusammen. Ich dachte mir, wenn diese aus alphanumerischen Zeichen besteht, und 50 Stellen lang ist, kann ich lang warten, bis sich eine solche ID regeneriert.
Delphi-Quellcode:
function CreateID : String;
// e.g.: 0mCn66760-VLs485uLU-mkU0t0Cxu-r80bLf63m-8Q7mDABsXV
var zw : System.String;
    i : System.Int32;
    s : System.Random;
begin
  zw:='';
  s:=System.Random.Create;
  for i := 1 to 50 do
    if (((i mod 10) = 0) and (i <> 50)) then
      zw:=zw+'-'
    else
      case s.Next(0, 3) of
        0: zw:=zw+Convert.ToChar(s.Next(48, 57));
        1: zw:=zw+Convert.ToChar(s.Next(65, 90));
        2: zw:=zw+Convert.ToChar(s.Next(97, 122));
      end;
  s.Free;
  result:=zw;
end;
Wenn ich die Funktion einzeln aufrufe, funktioniert das auch prima. Aber wenn ich die Funktion aus einer Schleife heraus z.B. 10 mal aufrufe, dann wird mir 10 mal dieselbe ID zurückgegeben.
Delphi-Quellcode:
for LfVar:=0 to 9 do
  ListBox1.SelectedIndex:=ListBox1.Items.Add(CreateID);
Rufe ich dieselbe Schleife nocheinmal auf, wird mir wieder 10 mal dieselbe, aber eine andere ID wie zuvor zurückgegeben.
Was übersehe ich da?

Danke, Stefan

P.S.: Was ich schon alles probiert habe - und nix gebracht hat...
+ System.Random.Create mit beliebigen Seeds gefüttert
+ für jede verwendete Zufallszahle eine eigene Instanz gebildet

Khabarakh 21. Sep 2006 19:52

Re: System.Random ...
 
Zitat:

Zitat von Steve9825679
+ System.Random.Create mit beliebigen Seeds gefüttert

Genau das wird das Problem sein: Der parameterlose Konstruktor von Random ermittelt den Seed durch die Systemzeit, anscheinend aber mit zu geringer Auflösung für deine Methode.
Zitat:

Zitat von SDK
However, if your application runs on a fast computer the system clock might not have time to change between invocations of this constructor; the seed value might be the same for different instances of Random. In that case, apply an algorithm to differentiate the seed value in each invocation.

So oder einfach ein kleines Sleep() einbauen ;) .

PS: Bei deinen vielen String-Konkatenationen wird dir der GC an die Decke springen. Benutze besser die StringBuilder-Klasse.

Phoenix 22. Sep 2006 06:58

Re: System.Random ...
 
Zitat:

Zitat von Steve9825679
Mit der Funktion CreateID bastle ich mir eine 50stellige ID zusammen.

Mal ne andere Idee: Benutze doch einfach eine GUID. Die sind jedesmal Eineindeutig wenn Du eine neue generieren lässt.

Steve9825679 22. Sep 2006 07:42

Re: System.Random ...
 
Morgen,

danke für die Tipps!
Eine System.Threading.Thread.Sleep(10) hat Wunder gewirkt :-)

Hab jetzt eine Lösung auf GUID-Basis gebastelt:

Delphi-Quellcode:
function CreateID : System.String;
var y : System.Guid;
    x : array of System.String;
begin
  x:=(y.NewGuid.ToString+'-'+y.NewGuid.ToString).Split(['-']);
  &Array.Sort(x);
  result:=System.&String.Join('-', x);
end;
Schönen Tag noch, Steff


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz