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 — Gera um valor aleatório através do Gerador de Números Aleatórios Mersenne Twister
Muitos geradores de números aleatórios de libcs mais antigos têm características duvidosas ou desconhecidas e são lentos. A função mt_rand() é um substituto imediato para a antiga rand(). Ele usa um gerador de números aleatórios com características conhecidas usando o » Mersenne Twister, que produzirá números aleatórios quatro vezes mais rápido do que o libc rand() médio fornece.
Se chamado sem os argumentos opcionais min
,
max
mt_rand()
retorna um valor pseudo-aleatório entre 0 e
mt_getrandmax(). Se você quiser um número aleatório
entre 5 e 15 (inclusive), por exemplo, use mt_rand(5,
15)
.
Esta função não gera valores criptograficamente seguros e não deve ser usada para propósitos criptográficos ou fins que exijam que os valores retornados sejam impossíveis de adivinhar.
Se aleatoriedade criptograficamente segura for necessária, a classe Random\Randomizer pode ser usada com o mecanismo Random\Engine\Secure. Para casos de uso simples, as funções random_int() e random_bytes() fornecem uma API conveniente e segura que é garantida pelo CSPRNG do sistema operacional.
min
Valor mais baixo opcional a ser retornado (padrão: 0)
max
Valor mais alto opcional a ser retornado (padrão: mt_getrandmax())
Um valor inteiro aleatório entre min
(ou 0)
e max
(ou mt_getrandmax(), inclusive),
ou false
se max
for menor que min
.
Versão | Descrição |
---|---|
7.2.0 | mt_rand() recebeu uma correção para um bug de defasagem de módulo. Isso significa que as sequências geradas com uma semente específica podem ser diferentes do PHP 7.1 em máquinas de 64 bits. |
7.1.0 | rand() foi transformado em um apelido de mt_rand(). |
7.1.0 |
mt_rand() foi atualizado para usar a versão fixa e correta do
algoritmo Mersenne Twister. Para voltar ao comportamento antigo, use mt_srand() com MT_RAND_PHP como segundo parâmetro.
|
Exemplo #1 Exemplo de mt_rand()
<?php
echo mt_rand(), "\n";
echo mt_rand(), "\n";
echo mt_rand(5, 15), "\n";
?>
O exemplo acima produzirá algo semelhante a:
1604716014 1478613278 6
O intervalo min
max
deve
estar dentro do intervalo mt_getrandmax(). Ou seja, (max
-
min
) <= mt_getrandmax()
Caso contrário, mt_rand() poderá retornar números aleatórios piores
do que deveria.
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)