Thema: Delphi Echte Zufallszahl

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.155 Beiträge
 
Delphi 12 Athens
 
#8

Re: Echte Zufallszahl

  Alt 8. Jun 2006, 11:28
OK, hab mal noch 'ne Umwandlung zwischen Integer und Cardinal reingemacht ... die "unsigned"-Warnung sollte nun weg sein (tja, das kommt davon, wenn ASM bei sowas nicht meckert -.-'')

Delphi-Quellcode:
Function Random(Range: LongInt): LongInt;
  Begin
    RandSeed := RandSeed * 134775813 + LongInt(((GetTickCount and 3) or 1);

    //Result := Int64(Range) * Int64(LongWord(RandSeed)) div Int64($100000000);
    Result := Int64(Int64(Range) * Int64(LongWord(RandSeed))) shr 32;
   End;
Baue diese Funktion am Besten nicht direkt in TForm1 ein ... einfach nur vor die ersten Funktionen (nach "implementation")

Die anderen Fehler scheinen mir daran zu liegen, daß du nur die Funktion in TForm1 definiert, aber die Funktion selber nicht richtig, oder garnicht im Implementations-Abschnitt eingebaut wurde.












PS: in Delphi selber sind die Funktionen etwa so in der System-Unit definiert.
Delphi-Quellcode:
Var RandSeed: LongInt;

Procedure Randomize;
  Var Count: LargeInt;

  Begin
    If QueryPerformanceCounter(Count) Then RandSeed := Count
    Else RandSeed := GetTickCount;
  End;

Function Random(Range: LongInt): LongInt; Overload;
  // Borland Delphi v7.0 Build 4453
  Begin
    RandSeed := RandSeed * 134775813 + 1;
    //Result := LargeInt(Range) * LongWord(RandSeed) div LargeInt($100000000);
    Result := TLargeIntRec(LargeInt(Range) * LongWord(RandSeed)).Hi;
  End;

Function Random: Extended; Overload;
  // Borland Delphi v7.0 Build 4453
  Begin
    RandSeed := RandSeed * 134775813 + 1;
    //Result := 1.0 * LongWord(RandSeed) / LargeInt($100000000);
    Result := LongWord(RandSeed) / LargeInt($100000000);
  End;
Wenn du dort genau hinsieht, dann wird du bemerken, daß beim Aufruf von Random der Wert rein mathematisch erechnet wird und somit in Wirklichkeit auch wieder eine fest definierte Zahlenreihe entsteht,
auch wenn diese Reihe durch den Aufruf von Randomize immer mal an 'ner anderen Stelle beginnt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat