PHP 随机浮点数生成器
PHP Random Float Number Generator
我是 PHP 的新手,很抱歉,如果这有点乱,我已经查看了 Whosebug,但找不到适合我需要的东西。
我正在尝试创建一个随机浮点数列表。但我遇到的问题是每次我 运行 它打印出相同数字的列表。任何人都可以解释为什么以及是否有办法在每次迭代中获得不同的数字。
感谢您的帮助。
<?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()
将 return 相同的微秒数,而 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/>";
}
?>
这样试试
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());
您应该只调用 srand()
或 mt_srand()
一次。他们初始化随机数生成器。您的代码在每次调用 mt_rand()
之前调用它,并且因为函数 frand()
需要不到一微秒的时间来完成,所以您每次都使用相同的值初始化随机数生成器。
正如 documentation 所说,不需要调用 mt_srand()
因为 PHP 解释器会为您完成。
唯一需要调用 mt_rand()
的情况是当您特别需要始终获得相同的随机数序列时;在这种情况下,您需要使用受控值来初始化它,而不是当前时间。
我是 PHP 的新手,很抱歉,如果这有点乱,我已经查看了 Whosebug,但找不到适合我需要的东西。
我正在尝试创建一个随机浮点数列表。但我遇到的问题是每次我 运行 它打印出相同数字的列表。任何人都可以解释为什么以及是否有办法在每次迭代中获得不同的数字。
感谢您的帮助。
<?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()
将 return 相同的微秒数,而 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/>";
}
?>
这样试试
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());
您应该只调用 srand()
或 mt_srand()
一次。他们初始化随机数生成器。您的代码在每次调用 mt_rand()
之前调用它,并且因为函数 frand()
需要不到一微秒的时间来完成,所以您每次都使用相同的值初始化随机数生成器。
正如 documentation 所说,不需要调用 mt_srand()
因为 PHP 解释器会为您完成。
唯一需要调用 mt_rand()
的情况是当您特别需要始终获得相同的随机数序列时;在这种情况下,您需要使用受控值来初始化它,而不是当前时间。