Демо рулетки на JavaScript без денег: случайность, тестирование и типичные ошибки

Учебная абстрактная круговая схема секторов рядом с кодовым блокнотом

Учебное демо рулетки удобно для разговора о диапазонах и тестируемости. Но оно не должно изображать настоящую систему денежных игр. Здесь есть только выбор целого номера от 0 до 36: без баланса, выплат, регистрации и обещаний «честности казино». Внешнее сходство механики не подтверждает пригодность к реальным операциям.

Модель с подменяемым источником

index.html

<!doctype html>
<html lang="ru"><meta charset="utf-8"><title>Демо случайного сектора</title>
<h1>Учебная модель: 37 секторов, без денег</h1>
<button id="spin" type="button">Выбрать сектор</button>
<p id="result" aria-live="polite">Результат ещё не выбран</p>
<script>
function chooseSector(rng = Math.random) {
  const value = rng();
  if (!Number.isFinite(value) || value < 0 || value >= 1) {
    throw new RangeError('Ожидается число из [0, 1)');
  }
  return Math.floor(value * 37);
}
document.querySelector('#spin').addEventListener('click', () => {
  document.querySelector('#result').textContent =
    `Сектор: ${chooseSector()}`;
});
</script></html>

MDN указывает, что Math.random возвращает псевдослучайное число в диапазоне от нуля включительно до единицы исключительно и не подходит для криптографической безопасности. Наш пример использует его только для учебной кнопки. Внедряемый rng позволяет отдельно проверить границы, не ожидая редких значений при обычных нажатиях.

Детерминированные проверки функции
Условие Что проверяет Результат
rng возвращает 0 Нижняя граница Ожидается сектор 0
rng возвращает 0.5 Середина диапазона Ожидается сектор 18
rng возвращает 0.999 Верхний допустимый участок Ожидается сектор 36
rng возвращает 1 Нарушение контракта Ожидается RangeError

Не проверяйте равномерность по нескольким попыткам

Серия из десяти результатов с повторениями не доказывает ошибку, а серия без повторений не подтверждает качество генератора. Тест функции отображения диапазона отвечает на вопрос о реализации формулы. Статистический анализ источника — отдельная задача с методикой и ограничениями. Не выдавайте удачную короткую демонстрацию за сертификацию случайности.

  • Проверить нижнюю границу и недопустимую единицу.
  • Проверить NaN и отрицательное значение.
  • Убедиться, что результат всегда целый в пределах модели.
  • Сохранить подпись об учебном характере без денежных функций.

Вопросы и ответы

Почему Math.floor, а не Math.round?

Округление к ближайшему целому меняет ширину крайних интервалов. В примере используется разбиение диапазона на 37 участков.

Можно ли добавить виртуальные очки?

Для учебной задачи это отдельная модель состояния. Она всё равно не подтверждает пригодность к денежным играм.

Нужно ли менять источник для безопасности?

Даже более сильный источник сам по себе не создаёт безопасную коммерческую систему. Здесь такой продукт не разрабатывается.

Почему функция принимает rng?

Это позволяет подать известные значения и проверить поведение границ без зависимости от случайной последовательности.

Источники: developer.mozilla.org.

Похожие записи