Одинаковый аргумент и результат
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. Неравномерность исходного алгоритма отмечена явно.