Dans la programmation PHP, les fonctions Rand () et getRandMax () sont des outils courants utilisés pour générer des nombres aléatoires. Cependant, pour de nombreux développeurs, il peut y avoir une question: pourquoi les valeurs maximales renvoyées par getrandmax () et rand () sont parfois non cohérentes?
Pour mieux comprendre ce problème, nous devons explorer en profondeur le fonctionnement de ces deux fonctions et de leur relation.
Rand () est une fonction de PHP utilisée pour générer des nombres pseudo-aléatoires. Il renvoie une valeur entière entre 0 et getRandMax () . Par défaut, les nombres aléatoires renvoyés par Rand () sont de 0 à getRandMax () , mais vous pouvez modifier cette plage en passant deux paramètres, comme indiqué ci-dessous:
<span><span><span class="hljs-variable">$random_number</span></span><span> = </span><span><span class="hljs-title function_ invoke__">rand</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">100</span></span><span>); </span><span><span class="hljs-comment">// générer 1 arriver 100 Nombre aléatoire entre</span></span><span>
</span></span>
La fonction getRandMax () est utilisée pour renvoyer la valeur entière maximale que la fonction rand () peut générer. Autrement dit, il vous indique la limite supérieure de la valeur de retour rand () . La taille de cette valeur n'est pas fixe, mais est déterminée par la mise en œuvre de PHP et l'algorithme de génération de nombres aléatoires de la plate-forme système.
<span><span><span class="hljs-variable">$max_rand_value</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getrandmax</span></span><span>(); </span><span><span class="hljs-comment">// retour rand() La valeur maximale de la fonction</span></span><span>
</span></span>
Tout d'abord, il doit être clair que la valeur maximale renvoyée par getRandMax () est liée à l'implémentation de génération de nombres aléatoires de la plate-forme et du PHP, et n'est pas nécessairement une constante fixe. La fonction rand () génère un nombre aléatoire basé sur cette limite supérieure, donc théoriquement la valeur renvoyée par Rand () ne doit pas dépasser la valeur maximale de getRandMax () .
Cependant, dans la pratique, la valeur maximale renvoyée par Rand () peut ne pas atteindre la limite supérieure de getRandMax () sur certaines plates-formes ou certaines configurations PHP, ce qui est généralement dû aux raisons suivantes:
Différences de mise en œuvre différentes entre différentes plateformes <br> La mise en œuvre de Rand () et GetRandMax () peut varier selon les systèmes d'exploitation ou les architectures matérielles. Par exemple, certaines plates-formes utilisent différents générateurs de nombres pseudo-aléatoires (PRNG), et les valeurs maximales de ces générateurs ne sont pas cohérentes. Par conséquent, bien que GetRandMax () renvoie une valeur maximale théorique, cette valeur ne peut pas être atteinte en raison de différentes implémentations dans la plage des nombres aléatoires réellement générés.
Implémentation interne PHP
PHP peut avoir quelques ajustements à la mise en œuvre de la fonction Rand () dans différentes versions. Dans certaines versions de PHP, Rand () peut utiliser différents algorithmes pour générer des nombres aléatoires, ce qui entraîne la valeur maximale renvoyée par getRandMax () et la valeur maximale renvoyée par Rand () . Ceci est généralement lié à la conception et à l'optimisation de l'algorithme.
Algorithme de nombre aléatoire utilisé
L'algorithme de génération de nombres aléatoires utilisé par PHP par défaut peut limiter la valeur maximale renvoyée dans certains cas. Par exemple, si vous utilisez un algorithme de générateur congruente linéaire (LCG), sa période et la plage de nombres aléatoires générés peuvent ne pas couvrir toutes les valeurs possibles de getRandMax () . Des générateurs de nombres aléatoires plus avancés, tels que Mersenne Twister, fournissent généralement une gamme plus grande et un nombre aléatoire de meilleure qualité.
Si vous souhaitez vous assurer que la valeur maximale renvoyée par Rand () est cohérente avec getRandMax () , vous pouvez utiliser les méthodes suivantes:
Utilisez mt_rand () au lieu de rand ()
MT_RAND () utilise l'algorithme Mersenne Twister, qui génère généralement une gamme plus large de nombres aléatoires et est plus uniforme, correspondant donc mieux à la valeur maximale de getrandmax () .
<span><span><span class="hljs-variable">$random_number</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mt_rand</span></span><span>(); </span><span><span class="hljs-comment">// utiliser mt_rand() Obtenez des nombres aléatoires</span></span><span>
</span></span>
Plage de limites manuelles <br> Si vous avez besoin d'utiliser Rand () et que vous souhaitez vous assurer que sa valeur ne dépasse pas GetRandMax () , vous pouvez gérer manuellement le nombre aléatoire. Vous pouvez utiliser les fonctions min () et max () pour vous assurer que la valeur de retour ne dépasse pas la limite maximale:
<span><span><span class="hljs-variable">$random_number</span></span><span> = </span><span><span class="hljs-title function_ invoke__">min</span></span><span>(</span><span><span class="hljs-title function_ invoke__">rand</span></span><span>(), </span><span><span class="hljs-title function_ invoke__">getrandmax</span></span><span>()); </span><span><span class="hljs-comment">// Assurez-vous de ne pas dépasser la valeur maximale</span></span><span>
</span></span>
Les valeurs maximales renvoyées par GetRandMax () et Rand () peuvent varier, principalement en raison de facteurs tels que la mise en œuvre de PHP, les différences de plate-forme et l'algorithme de nombre aléatoire utilisé. Bien qu'ils aient généralement la même limite supérieure, des différences peuvent se produire dans une utilisation réelle, en particulier sous différents systèmes d'exploitation ou architectures matérielles.
Si vous avez besoin d'un générateur de nombres aléatoires de meilleure qualité, mt_rand () est un meilleur choix car il est basé sur l'algorithme de Mersenne Twister, qui est généralement capable de générer une gamme plus large de nombres aléatoires et a une meilleure uniformité.