(PHP 8 >= 8.2.0)
Random\Engine::generate — Создаёт случайную последовательность
Возвращает случайную последовательность и передвигает состояние алгоритма на один шаг.
Случайная последовательность представлена двоичной строкой, содержащей случайные байты. Такое представление позволяет однозначно интерпретировать случайные биты, генерируемые алгоритмом, например, для адаптации различных размеров вывода, используемых различными алгоритмами.
Алгоритмы, которые изначально оперируют целыми значениями, должны возвращать
целое число в порядке little-endian байтов, например, используя функцию pack()
с кодом формата P
. Высокоуровневый интерфейс, предоставляемый классом Random\Randomizer,
будет интерпретировать возвращаемые случайные байты как целые числа без знака с малым порядком возрастания,
если требуется числовое представление.
Настоятельно рекомендуется, чтобы каждый бит возвращаемой строки был выбран равномерно и независимо, поскольку некоторые приложения требуют для корректной работы случайности на уровне битов. Например, линейные конгруэнтные генераторы часто генерируют менее качественную случайную последовательность для младших битов возвращаемого целого значения и поэтому не подходят для приложений, требующих случайной последовательности на уровне битов.
У этой функции нет параметров.
Пример #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 "Счастливое число: ", $r->getInt(0, 99), "\n";
?>
Результат выполнения данного примера:
Счастливое число: 4