To reiterate the message about *not* using mt_rand() for anything security related, here's a new tool that has been just posted that recovers the seed value given a single mt_rand() output:
http://www.openwall.com/php_mt_seed/README
(PHP 4, PHP 5, PHP 7, PHP 8)
mt_rand — Génère une valeur aléatoire via le générateur de nombre aléatoire Mersenne Twister
De nombreux générateurs de nombres aléatoires provenant de vieilles bibliothèques libcs ont des comportements douteux et sont très lents. mt_rand() est une fonction de remplacement pour rand(). Elle utilise un générateur de nombres aléatoire de caractéristique connue, le " » Mersenne Twister " qui est 4 fois plus rapide que la fonction standard libc.
Appelée sans les arguments optionnels min
et
max
, mt_rand() retourne un nombre
pseudoaléatoire, entre 0 et mt_getrandmax().
Pour obtenir un nombre entre 5 et 15 inclus, il faut utiliser
mt_rand(5,15)
.
Cette fonction ne génère pas de valeurs cryptographiquement sûres, et ne doit pas être utilisée à des fins cryptographiques, ou à des fins qui exigent que les valeurs renvoyées soient indéchiffrables.
Si de l'aléatoire cryptographiquement sûre est requis, le Random\Randomizer peut être utilisé avec le moteur Random\Engine\Secure. Pour des cas d'usage simple, les fonctions random_int() et random_bytes() fournissent une API pratique et sûre qui est qui est soutenu par le CSPRNG du système d'exploitation.
min
Valeur la plus basse qui peut être retournée (par défaut : 0)
max
Valeur la plus haute qui peut être retournée (par défaut : mt_getrandmax()).
Un entier aléatoire compris entre min
(ou 0)
et max
(ou mt_getrandmax(), inclusif),
ou false
si le paramètre max
est inférieur à
min
.
Version | Description |
---|---|
7.2.0 | mt_rand() a reçu une correction de bogue pour un bug de polarisation modulo. Cela signifie que les séquences générées avec une valeur d'initialisation spécifique peuvent différer de php 7.1 sur les machines 64-bit. |
7.1.0 | rand() est devenu un alias de mt_rand(). |
7.1.0 |
mt_rand()
a été mis à jour
pour utiliser la version corrigée, correcte, de l'algorithme Twister
Mersenne. Pour revenir à l'ancien comportement, utilisez
mt_srand() avec MT_RAND_PHP
comme deuxième paramètre.
|
Exemple #1 Exemple avec mt_rand()
<?php
echo mt_rand(), "\n";
echo mt_rand(), "\n";
echo mt_rand(5, 15), "\n";
?>
Résultat de l'exemple ci-dessus est similaire à :
1604716014 1478613278 6
La plage min
max
doit se situer
dans la plage mt_getrandmax(). i.e.
max
- min
) <=
mt_getrandmax() sinon, mt_rand() peut
retourner des nombres aléatoires plus pauvres qu'il ne le devrait.
To reiterate the message about *not* using mt_rand() for anything security related, here's a new tool that has been just posted that recovers the seed value given a single mt_rand() output:
http://www.openwall.com/php_mt_seed/README
To see some systematic deviations from a universal distribution run:
<?php
$alfabet = str_split('ADHKLMNPSTUWX');
$countalfabet = count($alfabet)-1;
$code = array_fill_keys($alfabet, 0);
for ($L=0; $L<80*$countalfabet; $L++)
{
$lettr = floor(mt_rand ( 0, $countalfabet ));
$code[$alfabet[$lettr]]++;
}
foreach($code as $L => $Freq)
{
for($F=0; $F<$Freq; $F++)
{
echo $L;
}
echo "\n<br/>";
}
?>
The seed is the PID + LCG (https://github.com/php/php-src/search?q=GENERATE_SEED&unscoped_q=GENERATE_SEED)