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(包括)之间的随机数,请使用 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 个注释

Pawe Krawczyk
10 年前
为了重申关于*不*将 mt_rand() 用于任何安全相关事项的消息,这里有一个新工具刚刚发布,它可以在给定一个 mt_rand() 输出的情况下恢复种子值

http://www.openwall.com/php_mt_seed/README
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/>";
}
?>
To Top