编程

PHP 8.3 提前预览:Random 扩展 - 新增 \Random\Randomizer::getFloat() 和 nextFloat() 方法

442 2023-04-18 03:14:00

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)