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
如有疑问,最好阅读手册。
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())
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
如有疑问,最好阅读手册。
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())