Statement on glibc/iconv Vulnerability

Random\Randomizer::nextFloat

(PHP 8 >= 8.3.0)

Random\Randomizer::nextFloatПолучает число с плавающей точкой из открытого справа интервала [0.0, 1.0)

Описание

public Random\Randomizer::nextFloat(): float

Возвращает равномерно выбранное равнораспределённое число с плавающей точкой из открытого справа интервала от 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 — нет.

Ошибки

Примеры

Пример #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

Смотрите также

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top