一种返回两个数字之间随机浮点数的优雅方式
<?php
function random_float ($min,$max) {
return ($min+lcg_value()*(abs($max-$min)));
}
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
lcg_value — 组合线性同余发生器
lcg_value() 返回一个介于 (0, 1) 之间的伪随机数。该函数结合了两个周期分别为 2^31 - 85 和 2^31 - 249 的 CG。该函数的周期等于这两个素数的乘积。
此函数不会生成密码学安全的数值,并且 *绝不能* 用于密码学目的,或需要返回数值不可猜测的目的。
如果需要密码学安全的随机性,可以使用 Random\Randomizer 和 Random\Engine\Secure 引擎。对于简单的用例,random_int() 和 random_bytes() 函数提供了一个方便且安全的 API,它由操作系统的 CSPRNG 支持。
使用乘法或加法(所谓的仿射变换)将返回值缩放至不同的区间可能会导致结果值出现偏差,因为浮点数在数轴上的密度并不均匀。由于并非所有值都可以被浮点数精确地表示,所以仿射变换的结果也可能导致值超出请求的区间。
使用 Random\Randomizer::getFloat() 生成任意区间内的随机浮点数。使用 Random\Randomizer::getInt() 生成任意区间内的随机整数。
此函数没有参数。
一个介于 0.0 和 1.0 之间的伪随机浮点数,包含边界值。
一种返回两个数字之间随机浮点数的优雅方式
<?php
function random_float ($min,$max) {
return ($min+lcg_value()*(abs($max-$min)));
}
?>
选择你的武器
<?php
function mt_randf($min, $max)
{
return $min + abs($max - $min) * mt_rand(0, mt_getrandmax())/mt_getrandmax();
}
function lcg_randf($min, $max)
{
return $min + lcg_value() * abs($max - $min);
}
function randf($min, $max)
{
return $min + rand(0,getrandmax()) / getrandmax() * abs($max - $min);
}?>