mt_getrandmax()
Découvrez la fonction mt_getrandmax() en PHP, qui retourne la valeur maximale pouvant être générée par mt_rand().
La fonction mt_getrandmax() en PHP retourne le plus grand entier possible que mt_rand() peut générer. Elle ne prend aucun argument et retourne une valeur constante pendant toute la durée d'exécution du script ; elle est principalement utilisée comme borne supérieure connue pour mettre à l'échelle ou normaliser des nombres aléatoires.
Cette page explique ce que retourne la fonction, sa syntaxe, pourquoi cette valeur est importante, comment l'utiliser pour générer un flottant aléatoire, les pièges courants, et comment elle diffère de l'ancienne fonction getrandmax().
Qu'est-ce que la fonction mt_getrandmax() ?
mt_getrandmax() est une fonction PHP intégrée qui retourne un int — la plus grande valeur que mt_rand() peut produire. Comme mt_rand() s'appuie sur le générateur de nombres pseudo-aléatoires Mersenne Twister, cette fonction expose la borne supérieure de la plage de sortie de ce générateur.
La valeur dépend de la plateforme, mais sur toutes les versions modernes de PHP, elle est 2147483647 (2^31 - 1). Elle ne croît pas sur les systèmes 64 bits — mt_rand() fonctionne toujours dans la plage 32 bits, donc mt_getrandmax() retourne le même nombre partout. Traitez-la comme une constante pendant toute la durée de votre script.
Syntaxe
mt_getrandmax(): int- Paramètres : aucun.
- Valeur de retour : l'entier maximum que
mt_rand()peut retourner.
Comment utiliser la fonction mt_getrandmax()
Utiliser mt_getrandmax() est simple — appelez-la sans argument. Voici un exemple basique :
Utilisation de base
Le code ci-dessus récupère la limite supérieure et la stocke dans une variable pour une utilisation ultérieure.
Définir une plage explicite
Vous pouvez combiner mt_getrandmax() avec mt_rand() pour rendre la plage de sortie complète explicite. Les deux appels ci-dessous sont équivalents — appeler mt_rand() sans argument retourne déjà une valeur entre 0 et mt_getrandmax() :
<?php
$max = mt_getrandmax();
$randomNumber = mt_rand(0, $max);
echo $randomNumber, "\n"; // some value in 0..2147483647
echo mt_rand(), "\n"; // identical range, no arguments needed
?>Générer un flottant aléatoire entre 0 et 1
L'utilisation réelle la plus courante de mt_getrandmax() est de normaliser un entier aléatoire en un flottant dans la plage [0, 1). Divisez l'entier aléatoire par le maximum :
<?php
$ratio = mt_rand() / (mt_getrandmax() + 1);
echo $ratio; // e.g. 0.4173...
?>Ajouter 1 au diviseur maintient le résultat strictement en dessous de 1. Pour mettre à l'échelle dans une plage [$min, $max] quelconque, multipliez le ratio par l'écart :
<?php
$min = 5;
$max = 25;
$value = $min + $ratio * ($max - $min);Pièges courants
- Ce n'est pas un setter.
mt_getrandmax()se contente de lire la borne supérieure — il n'existe aucun moyen de la modifier. Pour contraindre la sortie, passezminetmaxàmt_rand(). - Elle ne prend aucun argument. En passer un déclenchera une
ArgumentCountErroren PHP 8+. - Pas de sécurité cryptographique. Ni
mt_rand()ni sa plage ne conviennent pour des mots de passe, jetons ou clés. Pour une génération aléatoire sécurisée, utilisezrandom_int()ourandom_bytes(). - Évitez l'astuce du modulo pour les plages.
mt_rand() % $nintroduit un biais vers les petites valeurs. Préférezmt_rand(0, $n - 1).
mt_getrandmax() vs getrandmax()
PHP fournit deux générateurs en parallèle. getrandmax() indique la limite pour l'ancienne fonction rand(), tandis que mt_getrandmax() indique la limite pour mt_rand(). Depuis PHP 7.1, rand() et mt_rand() utilisent le même moteur Mersenne Twister en interne, donc les deux fonctions retournent 2147483647 — mais vous devriez quand même associer chaque *getrandmax() à son générateur correspondant pour plus de clarté.
Conclusion
mt_getrandmax() retourne la borne supérieure du générateur Mersenne Twister de PHP (2147483647 sur les versions modernes). Sa principale utilité est de servir de diviseur pour produire des flottants aléatoires normalisés et des plages mises à l'échelle. Pour une génération aléatoire sécurisée, utilisez plutôt random_int(), et n'oubliez pas que la fonction est en lecture seule — utilisez mt_rand($min, $max) pour contraindre réellement les résultats. Voir aussi mt_srand() pour initialiser le générateur.