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%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%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: