PHP 8.3 提前预览:Random 扩展 - 新增 \Random\Randomizer::getFloat() 和 nextFloat() 方法
PHP 8.3 中 Random 扩展中新增了 \Random\Randomizer::getFloat() 和 \Random\Randomizer::nextFloat() 方法,生成随机浮点值。
同时也新增了一个 \Random\IntervalBoundary 枚举,可用作 getFloat 方法的参数,用以说明是否应该限制最小值 $min 和最大值 $max。
\Random\Randomizer::getFloat() 方法
namespace Random;
class Randomizer {
// ...
public function getFloat(
float $min,
float $max,
\Random\IntervalBoundary $boundary = \Random\IntervalBoundary::ClosedOpen
): float {
}
}
$max 参数值必须大于 $min。否则会抛出 \ValueError 异常:$min and $max must be finite。
\Random\IntervalBoundary 枚举
\Random\Randomizer::getFloat() 方法接收 \Random\IntervalBoundary 枚举作为第三个参数,用来说明是否应该包含 $min 和 $max 值。
enum IntervalBoundary {
case ClosedOpen;
case ClosedClosed;
case OpenClosed;
case OpenOpen;
}
- IntervalBoundary::ClosedOpen: 必须放回 $min,可用不返回 $mim。
- IntervalBoundary::ClosedClosed: 必须同时返回 $min 和 $max。
- IntervalBoundary::OpenClosed: 可以不返回 $min,必须返回 $max。
- IntervalBoundary::OpenOpen: $min 或者 $max 都不能返回
用例
生成 0 到 10 之间的随机浮点数。
$rng = new Random\Randomizer();
$rng->getFloat(0, 10, \Random\IntervalBoundary::OpenOpen); // 9.3835746900717
$rng->getFloat(0, 10, \Random\IntervalBoundary::OpenOpen); // 3.065611591453
***
Generate a random `float` between `42 <=` and `< 43`.
```php
$rng = new Random\Randomizer();
// IntervalBoundary::ClosedOpen is the default $boundary parameter value.
$rng->getFloat(42, 43); // 42.777167603068
$rng->getFloat(42, 43); // 42.565307732356
\Random\Randomizer::nextFloat() 方法
新增的 \Random\Randomizer::nextFloat() 方法功能上和 \Random\Randomizer::getFloat(0, 1, \Random\IntervalBoundary::ClosedOpen) 完全相同。
JavaScript 的 Math.random() 也类似于 \Random\Randomizer::nextFloat(),它们都返回一个 0 到 1 之间的随机数。
namespace Random;
class Randomizer {
// ...
public function nextFloat(): float {
}
}
用例
生成 0 到 1 之间的随机数:
$rng = new Random\Randomizer();
$rng->nextFloat(); // 0.21185336351144
ValueError: Random\Randomizer::getFloat(): Argument #1 ($min) must be finite
ValueError: Random\Randomizer::getFloat(): Argument #2 ($max) must be greater than argument #1 ($min)