Comparaison des effets de php lcg_value et mt_rand générant des décimales aléatoires de 0 à 1

jacklove
Libérer: 2023-04-01 15:28:01
original
1601 Les gens l'ont consulté

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.

lcg_value Description

float lcg_value ( void )
Copier après la connexion

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;
}?>
Copier après la connexion

Sortie :

0.11516515851995
0.064684551575297
0.68275174031189
0.55730746529099
0.70215008878091
Copier après la connexion


Comparaison de deux méthodes de génération de décimales aléatoires 0~1


1. Comparaison du temps d'exécution

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(&#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);?>
Copier après la connexion

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(&#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);?>
Copier après la connexion

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.


2. Comparaison des effets aléatoires

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(&#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);?>
Copier après la connexion

Diagramme d'effet aléatoire :

Comparaison des effets de php lcg_value et mt_rand générant des décimales aléatoires de 0 à 1



Effet aléatoire de 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);?>
Copier après la connexion

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( ). Comparaison des effets de php lcg_value et mt_rand générant des décimales aléatoires de 0 à 1

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

Comment utiliser PHP pour print_r Méthode pour restaurer les données traitées dans le tableau d'origine

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!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal