(PHP 4, PHP 5, PHP 7, PHP 8)
mt_rand — 使用梅森旋转随机数生成器生成随机值
许多旧版 libcs 的随机数生成器具有可疑或未知的特性,而且速度很慢。mt_rand() 函数是旧版 rand() 的替代品。它使用具有已知特性的随机数生成器,使用 » 梅森旋转,其生成随机数的速度是平均 libc rand() 的四倍。
如果在不带可选 min
、max
参数的情况下调用,mt_rand() 返回 0 到 mt_getrandmax() 之间的伪随机值。例如,如果您想要 5 到 15(包括)之间的随机数,请使用 mt_rand(5, 15)
。
此函数不会生成加密安全的数值,并且*不得*用于加密目的或需要返回不可猜测值的用途。
如果需要加密安全的随机性,则可以使用 Random\Randomizer 与 Random\Engine\Secure 引擎。对于简单用例,random_int() 和 random_bytes() 函数提供了一个方便且安全的 API,它由操作系统的 CSPRNG 支持。
min
(或 0)和 max
(或 mt_getrandmax(),包括)之间的随机整数值,如果 max
小于 min
,则为 false
。
版本 | 描述 |
---|---|
7.2.0 | mt_rand() 已修复 模块偏差错误。这意味着使用特定种子生成的序列可能与 64 位机器上的 PHP 7.1 不同。 |
7.1.0 | rand() 已成为 mt_rand() 的别名。 |
7.1.0 |
mt_rand() 已更新 为使用已修复的正确版本的梅森旋转算法。要回退到旧的行为,请使用 mt_srand(),第二个参数为 MT_RAND_PHP 。 |
示例 #1 mt_rand() 示例
<?php
echo mt_rand(), "\n";
echo mt_rand(), "\n";
echo mt_rand(5, 15), "\n";
?>
上面的示例将输出类似于以下内容
1604716014 1478613278 6
min
max
范围必须在 mt_getrandmax() 范围内。即 (max
- min
) <= mt_getrandmax() 否则,mt_rand() 可能返回比应有的随机数更差的随机数。
为了重申关于*不*将 mt_rand() 用于任何安全相关事项的消息,这里有一个新工具刚刚发布,它可以在给定一个 mt_rand() 输出的情况下恢复种子值
http://www.openwall.com/php_mt_seed/README
要查看与通用分布的一些系统偏差,请运行
<?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/>";
}
?>