Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung von Pseudozufallszahlen und echten Zufallszahlen in PHP

Detaillierte Erklärung von Pseudozufallszahlen und echten Zufallszahlen in PHP

怪我咯
怪我咯Original
2017-07-11 11:41:352215Durchsuche

Dieser Artikel stellt hauptsächlich die detaillierte Erklärung von Pseudozufallszahlen und echten Zufallszahlen in PHP vor. Dieser Artikel erläutert zunächst die verwandten Konzepte von echten Zufallszahlen und Pseudozufallszahlen und gibt einen Vergleich der Verwendung von mt_rand()FunktionEin Beispielcode zur Generierung besserer Pseudozufallszahlen, Freunde, die ihn benötigen, können sich darauf beziehen

Zunächst muss festgestellt werden, dass der Computer keine absolut zufälligen Zufallszahlen generieren wird , der Computer kann nur „Pseudozufallszahlen“ generieren. Tatsächlich sind absolute Zufallszahlen nur ideale Zufallszahlen, egal wie sich der Computer entwickelt, er wird keine Folge absolut zufälliger Zahlen erzeugen. Computer können nur relativ zufällige Zahlen, also Pseudozufallszahlen, erzeugen.

Pseudozufallszahlen sind keine Pseudozufallszahlen. Das „Pseudo“ bedeutet hier regulär, was bedeutet, dass die von Computern generierten Pseudozufallszahlen sowohl zufällig als auch regelmäßig sind. Wie ist es zu verstehen? Die generierten Pseudozufallszahlen folgen manchmal bestimmten Regeln, manchmal folgen sie keinen Regeln; einige der Pseudozufallszahlen folgen bestimmten Regeln; Zum Beispiel: „Es gibt keine zwei Blätter mit der gleichen Form auf der Welt.“ Dies weist auf die Eigenschaften der Dinge hin, das heißt auf Zufälligkeit, aber die Blätter jedes Baumes haben ähnliche Formen, was die Gemeinsamkeit der Dinge darstellt , Regelmäßigkeit. Aus dieser Perspektive werden Sie wahrscheinlich die Tatsache akzeptieren, dass Computer nur Pseudozufallszahlen, aber keine absoluten Zufallszahlen generieren können.

Lassen Sie uns zunächst die Konzepte echter Zufallszahlen und Pseudozufallszahlen verstehen.

Echte Zufallszahlengeneratoren: Englisch: Echte Zufallszahlengeneratoren, abgekürzt als: TRNGs, sind Zufallszahlen, die durch unvorhersehbare physikalische Methoden generiert werden.

Pseudozufallszahlengeneratoren: Englisch: Pseudozufallszahlengeneratoren, abgekürzt als: PRNGs, werden von Computern mithilfe bestimmter Algorithmen generiert.

Vergleichen Sie die Bilder der Zufallszahlen, die durch die beiden Methoden generiert wurden.

Zufällige Bitmap, generiert von Random.org (die atmosphärisches Rauschen nutzt, das durch Gewitter in der Luft erzeugt wird):

Zufällige Bilder, generiert vom Rand ()-Funktion von PHP unter Windows:

Offensichtlich weisen die vom letztgenannten Pseudozufallszahlengenerator erzeugten Bilder diese offensichtlichen Streifen auf.

Der Code zur Verwendung der Rand-Random-Funktion von PHP zum Generieren dieses Bildes lautet:

Der Code lautet wie folgt:

//需要开启gd库
header("Content-type: image/png");
$im = imagecreatetruecolor(512, 512)
or die("Cannot Initialize new GD image stream");
$white = imagecolorallocate($im, 255, 255, 255);
for ($y=0; $y<512; $y++) {
for ($x=0; $x<512; $x++) {
if (rand(0,1) === 1) {
imagesetpixel($im, $x, $y, $white);
}
}
}
imagepng($im);
imagedestroy($im);

Tatsächlich nicht alles Pseudo -Zufälligkeit Die Wirkung von Zahlengeneratoren (PRNGs) ist so gering, aber es kommt einfach vor, dass die rand()-Funktion von PHP unter Windows so ist. Wenn derselbe Code unter Linux getestet wird, weist das resultierende Bild keine offensichtlichen Streifen auf. Wenn unter Windows die Funktion mt_rand() anstelle der Funktion rand() verwendet wird, ist der Effekt viel besser. Dies liegt daran, dass mt_rand() den Mersenne Twister-Algorithmus verwendet, um Zufallszahlen zu generieren. In der PHP-Dokumentation heißt es außerdem: mt_rand() kann Zufallswerte im Durchschnitt viermal schneller generieren als rand() von libc.

Das Folgende ist ein Beispielcode, der PHP verwendet, um bessere Pseudozufallszahlen als die Funktion mt_rand() zu generieren:

Der Code lautet wie folgt:

<?php
// get 128 pseudorandom bits in a string of 16 bytes
$pr_bits = &#39;&#39;;
// Unix/Linux platform?
$fp = @fopen(&#39;/dev/urandom&#39;,&#39;rb&#39;);
if ($fp !== FALSE) {
$pr_bits .= @fread($fp,16);
@fclose($fp);
}
// MS-Windows platform?
if (@class_exists(&#39;COM&#39;)) {
try {
$CAPI_Util = new COM(&#39;CAPICOM.Utilities.1&#39;);
$pr_bits .= $CAPI_Util->GetRandom(16,0);
// if we ask for binary data PHP munges it, so we
// request base64 return value. We squeeze out the
// redundancy and useless ==CRLF by hashing...
if ($pr_bits) { $pr_bits = md5($pr_bits,TRUE); }
} catch (Exception $ex) {
// echo &#39;Exception: &#39; . $ex->getMessage();
}
}
if (strlen($pr_bits) < 16) {
// do something to warn system owner that
// pseudorandom generator is missing
}
?>

Wenn PHP also echte Zufallszahlen generieren möchte, muss es dennoch externe Elemente aufrufen, um dies zu unterstützen!

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung von Pseudozufallszahlen und echten Zufallszahlen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn