PHP Conference Japan 2024

mt_rand

(PHP 4, PHP 5, PHP 7, PHP 8)

mt_rand通过梅森旋转算法随机数生成器生成随机值

描述

mt_rand(): int
mt_rand(int $min, int $max): int

许多旧版 libcs 的随机数生成器具有可疑或未知的特性,并且速度缓慢。 mt_rand() 函数是旧版 rand() 的替代品。它使用具有已知特性的随机数生成器,使用 » 梅森旋转算法,其生成随机数的速度是平均 libc rand() 的四倍。

如果在没有可选的 minmax 参数的情况下调用,mt_rand() 返回 0 到 mt_getrandmax() 之间的伪随机值。例如,如果您想要 5 到 15(包括 5 和 15)之间的随机数,请使用 mt_rand(5, 15)

注意

此函数不会生成密码学安全的数值,并且不得用于加密目的或需要返回不可猜测值的用途。

如果需要密码学安全的随机性,则可以使用 Random\RandomizerRandom\Engine\Secure 引擎。对于简单的用例,random_int()random_bytes() 函数提供了一个方便且安全的 API,它由操作系统的 CSPRNG 支持。

参数

min

可选的要返回的最小值(默认值:0)

max

可选的要返回的最大值(默认值:mt_getrandmax()

返回值

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() 返回的随机数可能不如预期那样好。

参见

添加注释

用户贡献的注释 3 条注释

4
greald at ghvernuft dot nl
1 年前
要查看与通用分布的一些系统偏差,请运行

<?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/>";
}
?>
0
Pawe Krawczyk
11 年前
为了重申关于*不要*将 mt_rand() 用于任何安全相关事项的消息,这里有一个新工具刚刚发布,它可以在给定单个 mt_rand() 输出的情况下恢复种子值

http://www.openwall.com/php_mt_seed/README
To Top