DamiRocK

Python: случайный результат и почему round(random() * 10) не даёт равные шансы

Разбираем детерминированность на примерах len() и random(). Сохраняем исходное упражнение с округлением и показываем меньшую вероятность крайних значений.

Одинаковый аргумент и результат

len("hexlet") для этой строки каждый раз возвращает 6. Вызов random() не принимает явных аргументов, но использует состояние генератора, поэтому последовательные вызовы могут давать разные результаты. Это свойство отличается от наличия побочного эффекта вроде вывода текста.

Задание источника

Получите целое число от 0 до 10, умножив результат random() на 10 и округлив:

from random import random

print(round(random() * 10))

Такое решение действительно выдаёт одно из целых 0,…,10. Конкретный ответ заранее не фиксируется, поэтому тест не должен требовать одного постоянного числа.

Неравномерность результата

Источник описывает результат как бросок игрового кубика, но не уточняет равенство вероятностей. После умножения значения лежат в [0;10). Числа около 0 округляются к нулю на интервале длины 0,5; около 10 — к десяти на таком же интервале. Каждое внутреннее целое получает интервал длины 1.

В идеализированной непрерывной модели шансы 0 и 10 равны примерно 5% каждый, а каждого числа 1,…,9 — 10%. Поэтому это не честный выбор из одиннадцати исходов. Дискретность реального генератора не устраняет различие длин интервалов.

Отдельное обобщение для равных шансов

Если требуется именно равномерное целое из 0,…,10, отдельное решение использует randrange(11):

from random import randrange
print(randrange(11))

Это редакционное расширение, не незаметная подмена упражнения, где требовались random и round. Стандартный модуль random предназначен для моделирования, а не для паролей и других криптографических секретов.

Hexlet / Code Basics и участники · Исходный урок и решение · Документация random · GNU AGPL v3. Неравномерность исходного алгоритма отмечена явно.

Reading preferences

Appearance
Contrast
More options

Saved only in this browser. Your device’s reduced-motion setting is always respected. Browser zoom works throughout the site.