mt_rand()总是给我相同的数字

4

我有一个问题,这个函数总是给我相同的数字: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'));

http://php.net/manual/en/function.mt-srand.php


1
以上代码片段是您实际的代码吗?能否请您发布更大的部分代码? - TimoStaudinger
1
我怀疑你的$hex值超过了“mt_getrandmax()”,而“mt_srand”也需要一个int(可能会将你的输入截断为int)。 - fbas
@TimoSta 这是我的代码有问题。@fbas 我已经用 substr($hex, 0, 10) 进行了测试,但很多次它都不起作用,我有相同的数字。 - p4c
1个回答

5
你的问题在于,你的变量$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值。


对于 PHP_INT_MAX,我有 2147483647 但是在本地主机上测试 (int)$hex 只能工作一次 /3,应该使用 substr 还是 int? - p4c
谢谢你,Rizier,它的效果非常好。我已经更新了我的第一个帖子,但我不使用shuffle,因为我总是需要相同字符串的相同结果。 - p4c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接