(PHP 8 >= 8.2.0)
Random\Engine::generate — 生成随机数
返回随机数并使算法的状态前进一步。
随机数由包含随机字节的二进制字符串表示。此表示形式允许无歧义地解释算法生成的随机位,例如适应不同算法使用的不同输出大小。
在整数上原生操作的算法应以小端字节序返回整数,例如通过利用pack() 函数和P
格式代码。由Random\Randomizer 提供的高级接口,如果需要数值表示,则会将返回的随机字节解释为无符号小端整数。
强烈建议返回字符串的每一位都是均匀且独立选择的,因为某些应用程序需要基于位级别的随机性才能正常工作。例如,线性同余生成器通常为返回值的较低有效位生成较低质量的随机性,因此不适用于需要位级随机性的应用程序。
此函数没有参数。
包含随机字节的非空字符串。
注意: Random\Randomizer 在内部使用 64 位无符号整数。如果返回的字符串包含超过 64 位(8 字节)的随机性,则将忽略超出部分的字节。其他应用程序可能能够一次处理超过 64 位的数据。
示例 #1 Random\Engine::generate() 示例
<?php
/**
* 实现模数为 65536、
* 乘数为 61 和增量为 17 的线性同余生成器,返回一个 8 位整数。
*
* 注意:此引擎仅适用于演示目的。
* 线性同余生成器通常生成低
* 质量的随机性,并且此特定实现具有
* 一个非常短的 16 位周期,不适合
* 几乎任何现实世界的用例。
*/
final class LinearCongruentialGenerator implements \Random\Engine
{
private int $state;
public function __construct(?int $seed = null)
{
if ($seed === null) {
$seed = random_int(0, 0xffff);
}
$this->state = $seed & 0xffff;
}
public function generate(): string
{
$this->state = (61 * $this->state + 17) & 0xffff;
return pack('C', $this->state >> 8);
}
}
$r = new \Random\Randomizer(
new LinearCongruentialGenerator(seed: 1)
);
echo "Lucky Number: ", $r->getInt(0, 99), "\n";
?>
以上示例将输出
Lucky Number: 4