(PHP 8 >= 8.3.0)
Random\Randomizer::nextFloat — Получает число с плавающей точкой из открытого справа интервала [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
.
Пример #1 Пример использования метода Random\Randomizer::nextFloat()
<?php
$r = new \Random\Randomizer();
// Результирующее логическое значение будет истинным с равной вероятностью.
$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;
// НЕ ДЕЛАЙТЕ ЭТОГО:
//
// Это выведет значение 4.5, несмотря на выборку метода nextFloat()
// из открытого справа интервала, который никогда не вернёт значение 1.
printf("Неправильное масштабирование: %.17g", $randomizer->nextFloat() * ($max - $min) + $min);
// Правильно:
// $randomizer->getFloat($min, $max, \Random\IntervalBoundary::ClosedOpen);
?>
Результат выполнения приведённого примера:
Неправильное масштабирование: 4.5