mt_rand()给了我相同的数字

时间:2015-05-17 16:56:12

标签: php random numbers hex

我的这个功能有问题,我的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 个答案:

答案 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值。