Einzelnen Beitrag anzeigen

Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
763 Beiträge
 
Delphi 11 Alexandria
 
#21

AW: Delphi 11 kein RandomRange für 64-bits?

  Alt 3. Mai 2022, 10:24
Ich meinte natürlich "Verlängerungsalgorithmus". Da hat unbemerkt die Autokorrektur des Tablets zugeschlagen gehabt...
Aber: was würde eigentlich dagehen sprechen das ungefähr so umzusetzen:

Delphi-Quellcode:
var
  r1, r2: UInt32;
  r: UInt64;
begin
  r1 := Random; // oder eine unbiased Alternative
  r2 := Random;
  r := (r1 shl 32)+r2;
Falls die von deinem random erzeugte 0-1 Folge völlig zufällig ist, dann geht das. Dann kannst du beliebig viele Bits aneinanderreihen.

Aber wie Gausi (und weiter oben Uwe) schreibt: Beim von Delphi verwendeten Generator sind die Zahlen alles andere als zufällig. Der Generator erzeugt die immer gleiche Zahlenfolge; alle Zahlen werden genau einmal erzeugt, bis wir wieder bei der ersten landen. Durch randseed legst du lediglich den Startwert der Zahlenfolge fest.

Wenn du einen solchen Generator wie du oben vorschlägst erweiterst, dann haust du massive Löcher in die Wertemenge.
(Ist fast ein wenig wie wenn du vorschlägst einen Text 2x512Bit zu verschlüsseln statt einmal mit 1024Bit.)

Sehr vereinfachend beschrieben:
Nimm an du hättest einen Generator, welcher immer die aus 10 Elementen bestehende Folge
0 1 2 3 4 5 6 7 8 9 (und dann wieder 0 1 2...) erzeugt.
Mit deiner Konstruktion würde der neue Generator
01 23 45 67 89 und dann wieder 01 erzeugen. Dein Generator hätte nur einen Bruchteil der von dir gewollten 100 Zahlen 00 bis 99 erzeugt.

Auf https://de.wikipedia.org/wiki/Kongruenzgenerator siehst du das von Gausi erwähnte typische Hyperebenenverhalten des in Delphi verwendeten Generators graphisch dargestellt.


Du könntest den 32Bit Delphi Generator natürlich für komplexere 64Bit Konstruktionen verwenden (zum Beispiel mehrere Generatoren mit verschiedenen randseeds verwenden und je nur eine Dezimalstelle (oder nur 4 Bits) berechnen). Aber das feste Muster wird dir viele Fallen stellen. Und der Speed wird dabei so fest leiden, dass du lieber zu einer 64Bit Lösung greifst.
Michael Gasser
  Mit Zitat antworten Zitat