Parce que je dois utiliser php pour générer 0~1 décimales aléatoires pour mon travail, j'ai déjà écrit un article "Méthode php pour générer 0~1 décimales aléatoires", basé sur mt_rand() et mt_getrandmax()Réalisé.
Plus tard, certains internautes ont commenté que la méthode native PHP lcg_value() peut générer des décimales aléatoires de 0 à 1.
float lcg_value ( void )
lcg_value() renvoie un nombre pseudo-aléatoire dans la plage (0, 1). Cette fonction combine deux générateurs congruents avec des périodes 2^31 - 85 et 2^31 - 249. La période de cette fonction est égale au produit de ces deux nombres premiers.
Retours : nombre pseudo-aléatoire compris dans la plage (0, 1).
<?phpfor ($i=0; $i<5; $i++){ echo lcg_value().PHP_EOL; }?>
Sortie :
0.11516515851995 0.064684551575297 0.68275174031189 0.55730746529099 0.70215008878091
Le temps d'exécution de l'algorithme basé sur mt_rand() et mt_getrandmax() 100 000 fois
<?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);?>
Sortie : temps d'exécution 266,893148 ms
Le temps d'exécution de l'exécution de lcg_value() 100 000 fois
<?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);?>
Sortie : temps d'exécution 86,178064 ms
Comparaison du temps d'exécution, car lcg_value() est directement une méthode native PHP, tandis que mt_rand() et mt_getrandmax() ont besoin pour appeler deux méthodes et nécessite des calculs, le temps d'exécution de lcg_value() est environ 3 fois plus rapide.
Effet aléatoire basé sur les algorithmes mt_rand() et 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);?>
Diagramme d'effet aléatoire :
Effet aléatoire de 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);?>
Diagramme d'effet aléatoire :
_rand( ) et mt_getrandmax() génèrent des effets aléatoires dans le désordre, et les effets aléatoires sont meilleurs que lcg_value( ).
Cet article explique la comparaison des effets de la génération de décimales aléatoires 0~1 entre php lcg_value et mt_rand Pour plus de contenu connexe, veuillez faire attention au site Web chinois de php.
Recommandations connexes ;
Comment utiliser PHP pour la classe de formatage des préfixes d'identification
Méthode pour déterminer si la connexion est disponible via PDO en php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!