Полезные коды в PHP и MySQL

15.37K
.
Krite
Класс рандома с контролем вероятности выпадения числа

<?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
Всего: 361