Параллельные симуляции повторяют случайные числа: SeedSequence

Симуляцию разбили на несколько задач, чтобы ускорить расчёт. Каждая создаёт default_rng(42). Код воспроизводим, но все воркеры получают одинаковую последовательность. Вместо четырёх независимых серий мы фактически четыре раза считаем одну и ту же.

Фиксированный seed задаёт начальное состояние генератора. Если он одинаков и команды совпадают, совпадает и результат. Для параллельной работы NumPy предлагает порождать дочерние SeedSequence из одного корня и передавать разным задачам разные дочерние состояния.

Как изменить решение

import numpy as np
root = np.random.SeedSequence(42)
children = root.spawn(3)
samples = [np.random.default_rng(s).normal(size=4) for s in children]
repeat = np.random.SeedSequence(42).spawn(3)
again = [np.random.default_rng(s).normal(size=4) for s in repeat]
assert all(np.array_equal(a,b) for a,b in zip(samples,again))
assert not np.array_equal(samples[0],samples[1])
print(np.array(samples))

Повтор построения дерева от того же корня воспроизводит серии, а соседние дочерние генераторы дают разные числа. Здесь spawn вызывается один раз для всей партии: повторный вызов на том же объекте продолжает порождение новых дочерних состояний.

Привяжите поток к устойчивому номеру задачи, а не к тому, какой процесс случайно первым получил работу. Иначе изменение расписания воркеров изменит результаты эксперимента. При повторе упавшей задачи ей обычно нужен тот же поток, чтобы повтор был воспроизводимым.

Что проверить на своих данных

Установите NumPy и запустите пример. Затем переставьте порядок выполнения дочерних задач, сохранив их номера: серия каждой задачи должна остаться прежней. Сохраните корневой seed, параметры генератора, версию окружения и схему распределения задач рядом с результатом расчёта.

Разные потоки не превращают симуляцию в статистически корректную модель. Размер выборки и распределения всё равно выбираются по задаче. Но одинаковый seed во всех воркерах создаёт более простую ошибку: эффективное разнообразие сценариев оказывается меньше заявленного. Проверка нескольких первых значений помогает поймать грубое копирование, а устойчивое назначение дочерних состояний предотвращает его при масштабировании вычислений.

Практика дальше

Случайные серии остаются массивами, которые нужно корректно преобразовать и агрегировать. В тренажёре «NumPy и pandas» вы закрепляете формы, маски и вычисления NumPy, затем групповые показатели pandas. Это практика вычислительной основы для последующих симуляций.

Посмотреть программу и практику курса

Источник: Параллельные симуляции повторяют случайные числа — официальная документация.

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

Продолжить на практике

  • NumPy и pandas: практический тренажёр ↗

    Бесплатный тренажёр NumPy и pandas для тех, кто знает основы Python. Научитесь очищать таблицы, объединять данные и собирать отчёты: 31 урок и 124 задачи с кодом и автоматической проверкой.