22 Stimmen

Bessere Zufallsgenerierung mit PHP

Ich weiß, dass nur die Verwendung von rand() ist berechenbar, wenn man weiß, was man tut, und Zugang zum Server hat.

Ich habe ein Projekt, das sehr von der Wahl einer möglichst unvorhersehbaren Zufallszahl abhängig. Ich suche also nach Vorschlägen, entweder andere eingebaute Funktionen oder Benutzerfunktionen, die eine Zufallszahl erzeugen können. besser Zufallszahl.

Ich habe dies für einen kleinen Test verwendet:

$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 dass es ein ungerades Muster gibt, wie oft jede Zahl erzeugt wird.

0 Stimmen

Es gibt eine neue Funktion in php7, die tut genau das, was Sie brauchen .

22voto

Christian Lescuyer Punkte 18425

Wenn man eine schlechte Zufallsquelle addiert, multipliziert oder abschneidet, erhält man ein schlechtes Zufallsergebnis. Siehe 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 beeindruckend, aber sie wurde von Scott Adams gezeichnet und nicht mit rand() aufgezeichnet).

Eine Lösung ist die Verwendung eines echten Zufallsgenerators wie z. B. random.org . Eine andere Möglichkeit, wenn Sie unter Linux/BSD/etc. arbeiten, ist die Verwendung von /dev/random . Wenn die Zufälligkeit einsatzkritisch ist, müssen Sie eine Hardware-Zufallsgenerator .

5voto

Kevin Punkte 12909

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

RANDOM.ORG ist ein echter Zufallszahlendienst, der Zufälligkeit erzeugt durch atmosphärisches Rauschen erzeugt.

4voto

Christian Lescuyer Punkte 18425

Ich wäre vorsichtig mit dem Eindruck der Zufälligkeit: Es gibt viele Experimente, bei denen die Menschen die weniger zufällige Verteilung wählen würden. Es scheint, dass der Verstand nicht sehr gut darin ist, Zufälligkeit zu erzeugen oder einzuschätzen.

Es gibt gute Artikel zum Thema Zufall unter Fourmilab einschließlich einer weiteren echter Zufallsgenerator . Vielleicht könnten Sie zufällige Daten von beiden Seiten abrufen, so dass Sie bei einem Ausfall einer Seite immer noch die andere haben.

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

Was Ihr letztes Programm betrifft, wenn Sie 10000 Werte erzeugen, warum wählen Sie dann nicht den endgültigen Wert unter den 10 Tausend? Damit beschränken Sie sich auf eine Teilmenge. Außerdem wird es nicht funktionieren, wenn Ihre $min und $max größer als 10000 sind.

Wie auch immer, die Zufälligkeit, die Sie benötigen, hängt von Ihrer Anwendung ab. rand() ist für ein Online-Spiel in Ordnung, aber nicht für die Kryptographie (alles, was nicht gründlich mit statistischen Programmen getestet wurde, ist ohnehin nicht für die Kryptographie geeignet). Sie sind der Richter!

2voto

Aaron Gong Punkte 907

Eine weitere Möglichkeit, Zufallszahlen zu erhalten, die dem Konzept der UUID ähnelt

PHP Version 5.3 und höher

openssl_random_pseudo_bytes(...)

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

1voto

Justin Yost Punkte 2320

Abwandlung von @KG, Verwendung der Millisekunden seit EPOCH als Seed für rand?

0 Stimmen

Sooooo, mit den heutigen schnellen Multicore-Computern haben Sie eine ziemlich gute Chance, den Seed mehrfach zu verwenden? Riesige rote Fahne - Sie erfinden das Rad neu, sogar srand() ohne Argumente leistet eine bessere ("zufälligere") Arbeit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X