Как переделать реализацию рандомайзера, который генерирует true/false, чтобы он генерировал случайные числа 1, 2, 3?

«Как переделать реализацию рандомайзера, который генерирует true/false, чтобы он генерировал случайные числа 1, 2, 3?» — вопрос из категории Алгоритмы и структуры данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Вместо генерации булевых значений нужно использовать функцию, возвращающую целое число в диапазоне [1, 3].

Прямой подход с random_int() (криптографически безопасный):

function getRandomNumberOneToThree(): int {
    return random_int(1, 3);
}

Обобщенная реализация для любого диапазона:

/**
 * Генерирует случайное целое число в диапазоне [min, max] включительно.
 */
function getRandomIntInRange(int $min, int $max): int {
    if ($min > $max) {
        throw new InvalidArgumentException('Минимум не может быть больше максимума');
    }
    return random_int($min, $max);
}

// Использование для нашей задачи
$randomValue = getRandomIntInRange(1, 3); // 1, 2 или 3

Почему random_int(), а не rand() или mt_rand()?

  • random_int() криптографически безопасен и подходит для задач, где важна непредсказуемость.
  • Генерирует криптографически стойкие псевдослучайные числа.
  • Включает оба граничных значения.

Оптимизация для частых вызовов (PHP 8.2+):

// Создаем экземпляр Randomizer один раз
$randomizer = new RandomRandomizer();

// Многократное использование
$value1 = $randomizer->getInt(1, 3);
$value2 = $randomizer->getInt(1, 3);