我的这个功能有问题,我的mt_rand()
总是给我相同的号码:
$hex = 'f12a218a7dd76fb5924f5deb1ef75a889eba4724e55e6568cf30be634706bd4c'; // i edit this string for each request
$hex = hexdec($hex);
mt_srand($hex);
$hex = sprintf("%04d", mt_rand('0','9999'));
$hex
始终更改,但结果始终相同4488
。
修改
$hex = str_split($hex);
$hex = implode("", array_slice($hex, 0, 7));
mt_srand($hex);
$number = sprintf("%04d", mt_rand('0','9999'));
答案 0 :(得分:5)
你的问题是,你总是在变量$hex
中得到一个浮点值。您还可以在manual中看到函数mt_srand()
:
void mt_srand([ int $ seed])
预期整数。它的作用是,它只是尝试将您的浮点值转换为整数。但由于失败,它将始终返回0.
所以最后你总是以种子0结束,然后又使用相同的“随机”数字。
如果你这样做,你可以看到:
var_dump($hex);
输出:
float(1.0908183557664E+77)
如果你想查看哪个整数最终会转换成你可以使用它:
var_dump((int)$hex);
你会发现它总是为0.
此外,如果您感兴趣,为什么您的号码最终为浮点数,这只是因为整数溢出,因为您的数字太大并且符合manual:
如果PHP遇到超出整数类型范围的数字,则将被解释为float而不是。此外,导致超出整数类型边界的数字的操作将返回浮点数。
如果你这样做:
echo PHP_INT_MAX;
您将获得int的最大值,即:
28192147483647 //32 bit
9223372036854775807 //64 bit
修改强>
那么现在如何解决这个问题并确保获得随机数?
首先想到的可能只是检查值是否大于PHP_INT_MAX,如果是,则将其设置为其他数字。但我认为,看起来你总是会有这么大的十六进制数。
所以我建议你这样:
$arr = str_split($hex);
shuffle($arr);
$hex = implode("", array_slice($arr, 0, 7));
在这里,我只是将您的数字拆分为一个包含str_split()
的数组,然后再将shuffle()
数组拆分,然后我implode()
将前面的7个数组元素{{3} }。
完成此操作后,您可以将其与hexdec()
一起使用,然后在mt_srand()
中使用。
另外,为什么我只获得前7个元素?因为那时我可以确保我没有达到PHP_INT_MAX值。