(PHP 8 >= 8.3.0)
Random\Randomizer::nextFloat — 從右開區間 [0.0, 1.0) 取得一個浮點數
從 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();
// 結果布林值將會以給定的機率為 true。
$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;
// 不要這樣做:
//
// 儘管 nextFloat() 從
// 右開區間取樣,永遠不會返回 1,但這會輸出 4.5。
printf("錯誤的縮放:%.17g", $randomizer->nextFloat() * ($max - $min) + $min);
// 正確的作法:
// $randomizer->getFloat($min, $max, \Random\IntervalBoundary::ClosedOpen);
?>
上述範例會輸出
Wrong scaling: 4.5