Mt_rand returns 0

Mt_rand returns 0

mt_rand(~PHP_INT_MAX, PHP_INT_MAX);

运行 几次给我以下输出:

php > echo mt_rand(~PHP_INT_MAX, PHP_INT_MAX) . PHP_EOL;
0
php > echo mt_rand(~PHP_INT_MAX, PHP_INT_MAX) . PHP_EOL;
0
php > echo mt_rand(~PHP_INT_MAX, PHP_INT_MAX) . PHP_EOL;
-3445259641993297920
php > echo mt_rand(~PHP_INT_MAX, PHP_INT_MAX) . PHP_EOL;
0
php > echo mt_rand(~PHP_INT_MAX, PHP_INT_MAX) . PHP_EOL;
0
php > echo mt_rand(~PHP_INT_MAX, PHP_INT_MAX) . PHP_EOL;
0

看起来不是很随意。谁能解释为什么它经常 returns 0?我期待一个 "random" 介于最低和最高可用

之间的数字

甚至更多,如果你稍微改变一下

echo mt_rand(-PHP_INT_MAX, PHP_INT_MAX)

它将开始返回 1 而不是 0

如有疑问,最好阅读手册。

PHP - mt_rand

Caution The distribution of mt_rand() return values is biased towards even numbers on 64-bit builds of PHP when max is beyond 2^32. This is because if max is greater than the value returned by mt_getrandmax(), the output of the random number generator must be scaled up.

正如 marcio 在评论中提到的那样,正确的解决方案是

mt_rand(-mt_getrandmax(), mt_getrandmax())