Vergleich der Auswirkungen von PHP lcg_value und mt_rand, die zufällige Dezimalzahlen von 0 bis 1 erzeugen

jacklove
Freigeben: 2023-04-01 15:28:01
Original
1582 Leute haben es durchsucht

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.

lcg_value Beschreibung

float lcg_value ( void )
Nach dem Login kopieren

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;
}?>
Nach dem Login kopieren

Ausgabe:

0.11516515851995
0.064684551575297
0.68275174031189
0.55730746529099
0.70215008878091
Nach dem Login kopieren


Vergleich zweier Methoden zur Generierung von 0~1 zufälligen Dezimalstellen


1. Vergleich der Ausführungszeit

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(&#39; &#39;, 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);?>
Nach dem Login kopieren

Ausgabe : Laufzeit 266,893148 ms

Laufzeit der 100.000-maligen Ausführung von lcg_value()

<?php// 获取microtimefunction get_microtime(){
    list($usec, $sec) = explode(&#39; &#39;, 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);?>
Nach dem Login kopieren

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.


2. Zufälliger Effektvergleich

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(&#39;content-type: image/png&#39;);$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);?>
Nach dem Login kopieren

Zufälliges Effektbild:

Vergleich der Auswirkungen von PHP lcg_value und mt_rand, die zufällige Dezimalzahlen von 0 bis 1 erzeugen



Zufälliger Effekt von lcg_value()

<?phpheader(&#39;content-type: image/png&#39;);$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);?>
Nach dem Login kopieren

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(). Vergleich der Auswirkungen von PHP lcg_value und mt_rand, die zufällige Dezimalzahlen von 0 bis 1 erzeugen

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

So verwenden Sie PHP für print_r Methode zum Wiederherstellen der verarbeiteten Daten im ursprünglichen Array

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!

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!