(PHP 8 >= 8.3.0)
Random\Randomizer::nextFloat — 从右开区间 [0.0, 1.0) 获取一个浮点数
返回一个从右开区间 0.0
到(不包括)1.0
统一选择的、等分布的浮点数。
返回的浮点数位于给定右开子区间内的概率与子区间的大小成正比。这意味着浮点数小于0.5
的概率为 50%,与浮点数至少0.5
的概率相等。同样,浮点数位于从 0.2
到(不包括)0.25
的右开区间内的概率正好为 5%。
此属性使您可以轻松利用 Random\Randomizer::nextFloat() 通过检查返回的浮点数是否小于给定概率来生成具有给定概率的随机布尔值。
注意:
Random\Randomizer::nextFloat() 可返回的浮点数域与
Randomizer::getFloat(0.0, 1.0, IntervalBoundary::ClosedOpen)
相同。Random\Randomizer::nextFloat() 的内部实现更高效。
使用乘法或加法(称为仿射变换)将返回值缩放到不同的区间可能会导致结果值出现偏差,因为浮点数在数轴上的密度并不相等。由于并非所有值都可以用浮点数准确表示,仿射变换的结果也可能由于隐式舍入导致产生超出请求区间的数值。有关仿射变换问题的深入解释,请参阅 Random\Randomizer::getFloat() 的文档。
使用 Random\Randomizer::getFloat() 生成任意区间内的随机浮点数。使用 Random\Randomizer::getInt() 生成任意区间内的随机整数。
此函数没有参数。
从右开区间 (IntervalBoundary::ClosedOpen
) [0.0, 1.0) 统一选择的、等分布的浮点数。 0.0
是可能返回值,1.0
不是。
Random\Randomizer::$engine
的 Random\Engine::generate() 方法抛出的任何 Throwable。
示例 #1 Random\Randomizer::nextFloat() 示例
<?php
$r = new \Random\Randomizer();
// 生成的布尔值将以给定概率为真。
$chance = 0.5;
$bool = $r->nextFloat() < $chance;
echo ($bool ? "您赢了" : "您输了"), "\n";
?>
上面的示例将输出类似以下内容
You won
示例 #2 使用仿射变换进行不正确的缩放
<?php
final class MaxEngine implements Random\Engine {
public function generate(): string {
return "\xff";
}
}
$randomizer = new \Random\Randomizer(new MaxEngine);
$min = 3.5;
$max = 4.5;
// 不要这样做:
//
// 这将输出 4.5,尽管 nextFloat() 从
// 右开区间采样,它永远不会返回 1。
printf("错误的缩放:%.17g", $randomizer->nextFloat() * ($max - $min) + $min);
// 正确:
// $randomizer->getFloat($min, $max, \Random\IntervalBoundary::ClosedOpen);
?>
上面的示例将输出
Wrong scaling: 4.5