(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