繁体   English   中英

mt_rand()给了我相同的数字

[英]mt_rand() gives me always the same number

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM