我是PHP的新手,很抱歉,如果这很混乱,我已经环顾了StackOverflow,但我找不到任何适合我需要的东西。
我正在尝试创建一个随机浮点数列表。但是我遇到的问题是每次我运行列表时,它都会打印出相同的数字。谁能解释为什么以及是否有办法在每次迭代中获得不同的数字。
谢谢你的任何帮助。
<?php
function frand($min, $max, $decimals = 0) {
mt_srand(microtime());
$scale = pow(10, $decimals);
return mt_rand($min * $scale, $max * $scale) / $scale;
}
for ($x = 1; $x <= 45; $x++) {
echo frand(1, 17, 8) . "<br/>";
}
?>
您应该在脚本中只使用一次mt_srand(microtime());
函数。
请注意,您的代码肯定会比 1 微秒更快运行。因此,microtime()
将返回相同数量的微秒,mt_srand
将生成相同的种子,这将影响相同的mt_rand
结果。
请尝试改用以下代码:
<?php
function frand($min, $max, $decimals = 0) {
$scale = pow(10, $decimals);
return mt_rand($min * $scale, $max * $scale) / $scale;
}
mt_srand(microtime());
for ($x = 1; $x <= 45; $x++) {
echo frand(1, 17, 8) . "<br/>";
}
?>
您应该只调用srand()
或mt_srand()
一次。他们初始化随机数生成器。您的代码在每次调用mt_rand()
之前调用它,并且由于函数frand()
需要远小于一微秒才能完成,因此每次都使用相同的值初始化随机数生成器。
正如文档所说,没有必要调用mt_srand()
因为PHP解释器会为您完成。
需要调用mt_rand()
的唯一情况是,您特别需要始终获取相同的随机数序列;在这种情况下,您需要使用受控值来初始化它,而不是当前时间。
尝试这样做
function frand($min, $max, $decimals = 0) {
$scale = pow(10, $decimals);
return mt_rand($min * $scale, $max * $scale) / $scale;
}
for ($x = 1; $x <= 45; $x++) {
echo frand(1, 17, 8) . "<br/>";
}
mt_srand(microtime());