Глава 23 · Приложение

Домашний проект B: генератор случайных историй

Пять независимых случайных выборов заполняют шаблон — а необязательный random.Random делает результат воспроизводимым в тестах.

Генератор заполняет шаблон предложения случайно выбранными словами из нескольких списков. Все существительные в списке — мужского рода, поэтому согласование с прилагательными не нарушается ни при каком сочетании:

story_generator.py
PRILAGATELNYE = ["храбрый", "любопытный", "рассеянный", "весёлый", "загадочный"]
SUSHESTVITELNYE = ["дракон", "программист", "кот", "путешественник", "робот"]
MESTA = ["в тёмном лесу", "на далёкой планете", "в старой библиотеке", "в подвале дома"]
GLAGOLY = ["нашёл", "потерял", "починил", "изобрёл", "спрятал"]
PREDMETY = ["волшебный ноутбук", "древний свиток", "сломанный компас", "банку варенья"]

SHABLON = (
    "Однажды {prilagatelnoe} {sushestvitelnoe} {mesto} {glagol} {predmet}. "
    "С тех пор жизнь его больше не была прежней."
)

Проверяемая случайность

Если sluchajnaya_istoriya() всегда обращается напрямую к глобальному состоянию модуля random, тест может проверить результат, только предварительно засеяв это глобальное состояние — хрупкий способ, легко ломающийся, если где-то ещё в программе тоже вызывается random . Вместо этого функция принимает необязательный генератор случайных чисел:

story_generator.py
def sluchajnaya_istoriya(rng: random.Random | None = None) -> str:
    generator = rng if rng is not None else random
    return SHABLON.format(
        prilagatelnoe=generator.choice(PRILAGATELNYE),
        sushestvitelnoe=generator.choice(SUSHESTVITELNYE),
        mesto=generator.choice(MESTA),
        glagol=generator.choice(GLAGOLY),
        predmet=generator.choice(PREDMETY),
    )
random.Random(seed) — независимый источник случайности
random.Random(1) создаёт отдельный генератор случайных чисел, не связанный с глобальным состоянием модуля random. Два экземпляра random.Random(7), созданные независимо, всегда выдают одну и ту же последовательность — на этом и строится детерминированный тест: sluchajnaya_istoriya(random.Random(7)), вызванная дважды с новым генератором на то же зерно, оба раза вернёт одну и ту же историю.

Полный код: projects/console/story-generator/story_generator.py

Задание

★★ Самостоятельная задача
Ещё один список

Добавьте список НАРЕЧИЯ (например, «внезапно», «случайно», «незаметно») и вставьте {narechie} в шаблон, сохранив согласование по роду.

GitHubGitHub-практика

Issue «Add random story generator», ветка feat/story-generator, тест на детерминированный результат с фиксированным random.Random , Pull Request.

Практика: случайные истории и random.Random()
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →