<?php declare(strict_types=1);
class ControlledRandom
{
private float $min;
private float $max;
private float $specialValue;
private float $specialProbability;
/**
* Конструктор класса.
*
* @param float $min Минимальное значение диапазона.
* @param float $max Максимальное значение диапазона.
* @param float $specialValue Специальное значение, которое должно выпадать с заданной вероятностью.
* @param float $specialProbability Вероятность выпадения специального значения (от 0 до 1).
* @throws InvalidArgumentException Если входные данные некорректны.
*/
public function __construct(float $min, float $max, float $specialValue, float $specialProbability)
{
$this->validateInput($min, $max, $specialValue, $specialProbability);
$this->min = $min;
$this->max = $max;
$this->specialValue = $specialValue;
$this->specialProbability = $specialProbability;
}
/**
* Генерирует случайное число с контролируемой вероятностью выпадения специального значения.
*
* @return float Сгенерированное число.
*/
public function generate(): float
{
// Генерация случайного числа от 0 до 1
$random = mt_rand() / mt_getrandmax();
// Если случайное число меньше specialProbability, возвращаем specialValue
if ($random < $this->specialProbability) {
return $this->specialValue;
}
// Иначе возвращаем случайное число из оставшегося диапазона, исключая specialValue
return $this->generateRandomExcludingSpecial();
}
/**
* Генерирует случайное число из диапазона [$min, $max], исключая specialValue.
*
* @return float Случайное число.
*/
private function generateRandomExcludingSpecial(): float
{
do {
$randomValue = $this->min + ($this->max - $this->min) * (mt_rand() / mt_getrandmax());
} while ($randomValue === $this->specialValue);
return $randomValue;
}
/**
* Проверяет корректность входных данных.
*
* @param float $min Минимальное значение диапазона.
* @param float $max Максимальное значение диапазона.
* @param float $specialValue Специальное значение.
* @param float $specialProbability Вероятность выпадения специального значения.
* @throws InvalidArgumentException Если входные данные некорректны.
*/
private function validateInput(float $min, float $max, float $specialValue, float $specialProbability): void
{
if ($min >= $max) {
throw new InvalidArgumentException("Минимальное значение должно быть меньше максимального.");
}
if ($specialValue < $min || $specialValue > $max) {
throw new InvalidArgumentException("Специальное значение должно быть в пределах диапазона [$min, $max].");
}
if ($specialProbability < 0 || $specialProbability > 1) {
throw new InvalidArgumentException("Вероятность должна быть в диапазоне от 0 до 1.");
}
}
}
Требуется php7.4 и вышеПример использование здесь https://onlinephp.io/c/1b927