Frage

Ich weiß, dass ich das nur benutze rand() ist vorhersehbar, wenn Sie wissen, was Sie tun, und Zugriff auf den Server haben.

Ich habe ein Projekt höchst hängt von der Wahl einer Zufallszahl ab, die möglichst unvorhersehbar ist.Daher suche ich nach Vorschlägen, entweder anderen integrierten Funktionen oder Benutzerfunktionen, die eine generieren können besser Zufallszahl.

Ich habe dies verwendet, um einen kleinen Test zu machen:

$i = 0;

while($i < 10000){
    $rand = rand(0, 100);

    if(!isset($array[$rand])){
        $array[$rand] = 1;
    } else {
        $array[$rand]++;
    }

    sort($array);
    $i++;
}

Ich habe festgestellt, dass die Ergebnisse gleichmäßig verteilt sind und es ein seltsames Muster gibt, wie oft jede Zahl generiert wird.

War es hilfreich?

Lösung

Das Addieren, Multiplizieren oder Abschneiden einer schlechten Zufallsquelle führt zu einem schlechten Zufallsergebnis.Sehen Einführung in Zufälligkeit und Zufallszahlen für eine Erklärung.

Sie haben Recht mit der PHP-Funktion rand().Siehe die zweite Abbildung auf Statistische Analyse für eine eindrucksvolle Illustration.(Die erste Abbildung ist auffällig, aber sie wurde von Scott Adams gezeichnet und nicht mit rand() geplottet).

Eine Lösung besteht darin, einen echten Zufallsgenerator zu verwenden, z random.org.Eine andere, wenn Sie Linux/BSD/usw. verwenden.ist zu verwenden /dev/random.Wenn die Zufälligkeit geschäftskritisch ist, müssen Sie a verwenden Hardware-Zufallsgenerator.

Andere Tipps

random.org verfügt über eine API, auf die Sie über HTTP zugreifen können.

Random.org ist ein echter Zufallszahlendienst, der durch atmosphärisches Rauschen Zufälligkeit erzeugt.

Ich wäre vorsichtig vor dem Eindruck von Zufälligkeit:Es gab viele Experimente, bei denen Menschen die weniger zufällige Verteilung wählten.Es scheint, dass der Verstand nicht sehr gut darin ist, Zufälligkeiten zu erzeugen oder einzuschätzen.

Es gibt gute Artikel zum Thema Zufälligkeit unter Fourmilab, darunter ein weiterer echter Zufallsgenerator.Vielleicht könnten Sie zufällige Daten von beiden Websites erhalten, sodass Sie, wenn eine nicht verfügbar ist, immer noch die andere haben.

Fourmilab bietet auch eine Testprogramm um die Zufälligkeit zu überprüfen.Sie könnten es verwenden, um Ihre verschiedenen myRand()-Programme zu überprüfen.

Was Ihr letztes Programm betrifft: Wenn Sie 10.000 Werte generieren, warum wählen Sie dann nicht den Endwert unter den 10.000 aus?Sie beschränken sich auf eine Teilmenge.Außerdem funktioniert es nicht, wenn Ihr $min und $max größer als 10000 sind.

Wie auch immer, die benötigte Zufälligkeit hängt von Ihrer Anwendung ab.rand() ist für ein Online-Spiel in Ordnung, für die Kryptografie jedoch nicht (alles, was nicht gründlich mit Statistikprogrammen getestet wurde, ist ohnehin nicht für die Kryptografie geeignet).Du entscheidest!

Variation von @KG, wobei die Millisekunden seit EPOCH als Startwert für Rand verwendet werden?

Eine andere Möglichkeit, Zufallszahlen zu erhalten, deren Konzept der UUID-Ermittlung ähnelt

PHP Version 5.3 und höher

openssl_random_pseudo_bytes(...)

Oder Sie können Folgendes versuchen Bibliothek unter Verwendung von RFC4122

Ein neuer PHP7 Es gibt eine Funktion, die genau das tut, was Sie brauchen:es erzeugt kryptografisch sichere pseudozufällige Ganzzahlen.

int random_int ( int $min , int $max )

Generiert kryptografische Zufallsgifte, die für die Verwendung geeignet sind, wenn unvoreingenommene Ergebnisse kritisch sind (dhMischen eines Pokerdecks).

Für eine detailliertere Erklärung zu PRNG und CSPRNG (und ihren Unterschieden) sowie dazu, warum Ihr ursprünglicher Ansatz eigentlich eine schlechte Idee ist, lesen Sie bitte meine eine weitere sehr ähnliche Antwort.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top