你的问题在于,你的变量
$hex
总是以浮点数的形式结束。正如你在
手册中看到的一样,函数
mt_srand()
需要接受一个整数参数:
void mt_srand ([ int $seed ] )
该函数期望的是整数类型,因此它会试图将你的浮点数转换为整数类型。但由于这个过程失败了,它将始终返回0。
这意味着,最终你总会得到种子0,从而生成相同的“随机”数字。
如果你执行以下操作,你就可以看到这一点:
var_dump($hex);
输出:
float(1.0908183557664E+77)
如果您想知道将其转换为整数后它会变成哪个整数,可以使用以下代码:
var_dump((int)$hex);
你会发现它始终为0。
如果你对为什么你的数字最终呈现为浮点型感兴趣,那是由于整数溢出,因为你的数字太大了,根据手册:
如果PHP遇到一个超出整数类型范围的数字,它将被解释为浮点数。此外,导致结果超出整数类型范围的操作将返回浮点数。
如果你执行以下操作:
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个数组元素,我可以使用
array_slice()
获得这些元素。
完成此操作后,您可以在hexdec()
中使用它,然后在mt_srand()
中使用它。
另外,为什么我只获取前7个元素?因为这样我就可以确保不会超过PHP_INT_MAX值。
substr($hex, 0, 10)
进行了测试,但很多次它都不起作用,我有相同的数字。 - p4c