Maison > développement back-end > tutoriel php > Résumé des méthodes pour générer des nombres aléatoires en PHP

Résumé des méthodes pour générer des nombres aléatoires en PHP

php中世界最好的语言
Libérer: 2023-03-20 19:10:02
original
2052 Les gens l'ont consulté

Le nombre aléatoire est une méthode très couramment utilisée. Cet article résume les méthodes de génération de nombres aléatoires en PHP. Il est divisé en quatre méthodes et la comparaison entre chaque méthode peut s'y référer.

La première méthode utilise mt_rand()

function GetRandStr($length){ 
$str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 
$len=strlen($str)-1; 
$randstr=''; 
for($i=0;$i<$length;$i++){ 
$num=mt_rand(0,$len); 
$randstr .= $str[$num]; 
} 
return $randstr; 
} 
$number=GetRandStr(6); 
echo $number;
Copier après la connexion

La deuxième méthode (la plus rapide)

function make_password( $length = 8 ) 
{ 
 // 密码字符集,可任意添加你需要的字符 
 $chars = array(&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;, &#39;f&#39;, &#39;g&#39;, &#39;h&#39;, 
 &#39;i&#39;, &#39;j&#39;, &#39;k&#39;, &#39;l&#39;,&#39;m&#39;, &#39;n&#39;, &#39;o&#39;, &#39;p&#39;, &#39;q&#39;, &#39;r&#39;, &#39;s&#39;, 
 &#39;t&#39;, &#39;u&#39;, &#39;v&#39;, &#39;w&#39;, &#39;x&#39;, &#39;y&#39;,&#39;z&#39;, &#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;, 
 &#39;E&#39;, &#39;F&#39;, &#39;G&#39;, &#39;H&#39;, &#39;I&#39;, &#39;J&#39;, &#39;K&#39;, &#39;L&#39;,&#39;M&#39;, &#39;N&#39;, &#39;O&#39;, 
 &#39;P&#39;, &#39;Q&#39;, &#39;R&#39;, &#39;S&#39;, &#39;T&#39;, &#39;U&#39;, &#39;V&#39;, &#39;W&#39;, &#39;X&#39;, &#39;Y&#39;,&#39;Z&#39;, 
 &#39;0&#39;, &#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;, &#39;6&#39;, &#39;7&#39;, &#39;8&#39;, &#39;9&#39;, &#39;!&#39;, 
 &#39;@&#39;,&#39;#&#39;, &#39;$&#39;, &#39;%&#39;, &#39;^&#39;, &#39;&&#39;, &#39;*&#39;, &#39;(&#39;, &#39;)&#39;, &#39;-&#39;, &#39;_&#39;, 
 &#39;[&#39;, &#39;]&#39;, &#39;{&#39;, &#39;}&#39;, &#39;<&#39;, &#39;>&#39;, &#39;~&#39;, &#39;`&#39;, &#39;+&#39;, &#39;=&#39;, &#39;,&#39;, 
 &#39;.&#39;, &#39;;&#39;, &#39;:&#39;, &#39;/&#39;, &#39;?&#39;, &#39;|&#39;); 
 // 在 $chars 中随机取 $length 个数组元素键名 
 $keys = array_rand($chars, $length); 
 $password = &#39;&#39;; 
 for($i = 0; $i < $length; $i++) 
 { 
  // 将 $length 个数组元素连接成字符串 
  $password .= $chars[$keys[$i]]; 
 } 
 return $password; 
}
Copier après la connexion

La troisième façon est d'obtenir l'horodatage actuel

function get_password( $length = 8 ) 
{ 
 $str = substr(md5(time()), 0, $length);//md5加密,time()当前时间戳 
 return $str; 
}
Copier après la connexion

La quatrième façon est de brouiller la chaîne

function getrandstr(){ 
$str=&#39;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890&#39;; 
$randStr = str_shuffle($str);//打乱字符串 
$rands= substr($randStr,0,6);//substr(string,start,length);返回字符串的一部分 
return $rands; 
}
Copier après la connexion

/ /Commencer à créer un code de vérification (générer directement avec la fonction, plus pratique et plus rapide)

$code = rand(10000, 99999);
Copier après la connexion

Comparaison de l'effet de php mt_rand générant 0~1 décimales aléatoires

description de lcg_value

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).

<?php 
for($i=0; $i<5; $i++){ 
 echo lcg_value().PHP_EOL; 
} 
?>
Copier après la connexion

Sortie :

0,11516515851995
0,064684551575297
0,68275174031189
0,557307465 2909 9
0.70215008878091

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

1. Comparaison du temps d'exécution

Exécution 100 000 fois basée sur mt_rand() et mt_getrandmax( )Le temps d'exécution de l'algorithme

<?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);
}

// 获取microtime
function 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
// 获取microtime
function 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 PHP native, et mt_rand() et mt_getrandmax() doivent appeler deux méthodes et doivent être calculées, donc le exécution de lcg_value() Le temps 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

Effet aléatoire de lcg_value()

<?php
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 = 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

Recommandations associées :

Implémentation JS du partage de code de nombres aléatoires

Méthode d'implémentation du générateur de nombres aléatoires JavaScript

Comment générer des nombres aléatoires et concaténer des chaînes dans MySQL


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:
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