Da ich für meine Arbeit PHP verwenden muss, um 0~1 zufällige Dezimalstellen zu generieren, habe ich zuvor einen Artikel „PHP-Methode zur Generierung von 0~1 zufälligen Dezimalstellen“ geschrieben, basierend auf mt_rand() und mt_getrandmax()Erreicht.
Später bemerkten einige Internetnutzer, dass die native PHP-Methode lcg_value() zufällige Dezimalzahlen von 0 bis 1 generieren kann.
float lcg_value ( void )
lcg_value() gibt eine Pseudozufallszahl im Bereich (0, 1) zurück. Diese Funktion kombiniert zwei Kongruenzgeneratoren mit den Perioden 2^31 - 85 und 2^31 - 249. Die Periode dieser Funktion ist gleich dem Produkt dieser beiden Primzahlen.
Rückgabe: Pseudozufallszahl im Bereich (0, 1).
<?phpfor ($i=0; $i<5; $i++){ echo lcg_value().PHP_EOL; }?>
Ausgabe:
0.11516515851995 0.064684551575297 0.68275174031189 0.55730746529099 0.70215008878091
Die Laufzeit der 100.000-fachen Ausführung des Algorithmus basierend auf mt_rand() und mt_getrandmax()
<?php/** * 生成0~1随机小数 * @param Int $min * @param Int $max * @return Float */function randFloat($min=0, $max=1){ return $min + mt_rand()/mt_getrandmax() * ($max-$min); }// 获取microtimefunction get_microtime(){ list($usec, $sec) = explode(' ', microtime()); return (float)$usec + (float)$sec; }// 记录开始时间$starttime = get_microtime();// 执行10万次获取随机小数for($i=0; $i<100000; $i++){ randFloat(); }// 记录结束时间$endtime = get_microtime();// 输出运行时间printf("run time %f ms\r\n", ($endtime-$starttime)*1000);?>
Ausgabe : Laufzeit 266,893148 ms
Laufzeit der 100.000-maligen Ausführung von lcg_value()
<?php// 获取microtimefunction get_microtime(){ list($usec, $sec) = explode(' ', microtime()); return (float)$usec + (float)$sec; }// 记录开始时间$starttime = get_microtime();// 执行10万次获取随机小数for($i=0; $i<100000; $i++){ lcg_value(); }// 记录结束时间$endtime = get_microtime();// 输出运行时间printf("run time %f ms\r\n", ($endtime-$starttime)*1000);?>
Ausgabe: Laufzeit 86,178064 ms
Vergleich der Ausführungszeit, da lcg_value() direkt eine native PHP-Methode ist und mt_rand() und mt_getrandmax() zwei Methoden aufrufen und berechnet werden müssen, Daher ist die Ausführungszeit von lcg_value() etwa dreimal schneller.
Zufälliger Effekt basierend auf den Algorithmen mt_rand() und mt_getrandmax()
<?php/** * 生成0~1随机小数 * @param Int $min * @param Int $max * @return Float */function randFloat($min=0, $max=1){ return $min + mt_rand()/mt_getrandmax() * ($max-$min); } header('content-type: image/png');$im = imagecreatetruecolor(512, 512);$color1 = imagecolorallocate($im, 255, 255, 255);$color2 = imagecolorallocate($im, 0, 0, 0);for($y=0; $y<512; $y++){ for($x=0; $x<512; $x++){ $rand = randFloat(); if(round($rand,2)>=0.5){ imagesetpixel($im, $x, $y, $color1); }else{ imagesetpixel($im, $x, $y, $color2); } } } imagepng($im); imagedestroy($im);?>
Zufälliges Effektbild:
Zufälliger Effekt von lcg_value()
<?phpheader('content-type: image/png');$im = imagecreatetruecolor(512, 512);$color1 = imagecolorallocate($im, 255, 255, 255);$color2 = imagecolorallocate($im, 0, 0, 0);for($y=0; $y<512; $y++){ for($x=0; $x<512; $x++){ $rand = lcg_value(); if(round($rand,2)>=0.5){ imagesetpixel($im, $x, $y, $color1); }else{ imagesetpixel($im, $x, $y, $color2); } } } imagepng($im); imagedestroy($im);?>
Zufallseffektdiagramm:
Der getrandmax()-Algorithmus generiert zufällige Effekte, die nicht in der richtigen Reihenfolge sind, und die zufälligen Effekte sind besser als lcg_value().
In diesem Artikel wird der Vergleich der Auswirkungen der Generierung von 0 bis 1 zufälligen Dezimalzahlen zwischen PHP lcg_value und mt_rand erläutert. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.
Verwandte Empfehlungen;
So verwenden Sie PHP für den ID-Präfix-Formatierungskurs
Methode zum Bestimmen, ob die Verbindung über PDO in PHP verfügbar ist
Das obige ist der detaillierte Inhalt vonVergleich der Auswirkungen von PHP lcg_value und mt_rand, die zufällige Dezimalzahlen von 0 bis 1 erzeugen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!