gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:53:38 24 4
gpt4 key购买 nike

这个函数总是有问题,我的 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

最佳答案

您的问题是,您总是在变量 $hex 中得到一个浮点值。函数 mt_srand() 也可以在 manual 中看到:

void mt_srand ([ int $seed ] )

需要一个整数。所以它所做的是,它只是尝试将您的浮点值转换为整数。但由于失败,它将始终返回 0。

所以最后你总是以种子 0 结束,然后也以相同的“随机”数字结束。

如果你这样做,你会看到这个:

var_dump($hex);

输出:

float(1.0908183557664E+77)

如果你想知道转换后最终会变成哪个整数,你可以使用这个:

var_dump((int)$hex);

你会发现它永远是 0。


此外,如果您感兴趣,为什么您的数字最终会变成 float ,这仅仅是因为整数溢出,因为您的数字太大并且符合 manual :

If PHP encounters a number beyond the bounds of the integer type, it will be interpreted as a float instead. Also, an operation which results in a number beyond the bounds of the integer type will return a float instead.

如果你这样做:

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()我用 array_slice() 得到的前 7 个数组元素.

完成此操作后,您可以将它与 hexdec() 一起使用,然后在 mt_srand() 中使用它。

还有为什么我只得到前 7 个元素?仅仅是因为这样我就可以确保我不会达到 PHP_INT_MAX 值。

关于php - mt_rand() 总是给我相同的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30289516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com