Wie implementiert man eine zufällige Float-Funktion, so dass sie keine Entropie verliert? (PHP)

8

Ich versuche zufällige Fließkommazahlen zu erzeugen, indem ich nur Bytes verwende, die ich von / dev / urandom bekomme. Momentan ist es meine beste Idee, die Plattformpräzision zu bekommen, indem ich so etwas mache:

%Vor%

und konstruiere dann eine Zeichenkette von 0-9 in einer Schleife, wie oft $ maximumPrecision uns sagt. Zum Beispiel, wenn die Genauigkeit 12 ist, würde ich 12 Zufallszahlen generieren und verketten. Ich denke, es ist eine hässliche Idee.

Update: Macht das Sinn?

%Vor%     
Tower 11.09.2010, 15:36
quelle

2 Antworten

4

Der Float-Typ von PHP ist typischerweise als IEEE-Double implementiert. Dieses Format hat eine 52-Bit-Mantissengenauigkeit, so dass es im Prinzip in der Lage sein sollte, 2 52 verschiedene uniform -Zahlen in [0, 1] zu erzeugen.

Sie können also 52 Bits aus dem / dev / urandom extrahieren, als ganze Zahl interpretieren und durch 2 52 dividieren. Zum Beispiel :

%Vor%     
kennytm 11.09.2010, 16:02
quelle
1

Das Problem hierbei ist, dass die IEEE-Double-Precision-Nummer in Form von Exponenten der Basis 2 definiert ist:

%Vor%

Da Sie einen Exponenten -1 haben wollen, und es gibt keine ganze Zahl n , so dass 2^n = 0.1 , wird es kompliziert.

Dies erzeugt eine Zahl zwischen 1 und 2. Sie können 1 subtrahieren, aber Sie werden eine winzige Menge an Entropie verlieren, wenn Sie das tun (KennyTMs Antwort ergibt eine Zahl in diesem Bereich und verwendet alle Entropie - - Diese Antwort versucht, die Repräsentation direkt zu erstellen:

%Vor%     
Artefacto 11.09.2010 17:48
quelle

Tags und Links