Метод spawn
Метод spawn класса Generator создает один или несколько
дочерних генераторов случайных чисел, которые наследуют состояние
родительского генератора, но затем расходятся, обеспечивая независимые
потоки случайных чисел. Это особенно важно для параллельных вычислений,
где каждый поток должен иметь свой собственный генератор, чтобы избежать
повторения последовательностей.
Метод принимает один необязательный параметр ⁅i⁆n_children⁅/i⁆ - количество дочерних генераторов, которое необходимо создать. Если параметр не указан, возвращается один новый генератор. Если указан, возвращается список генераторов указанной длины.
Синтаксис
# Создание одного дочернего генератора
child_gen = rng.spawn()
# Создание нескольких дочерних генераторов
children = rng.spawn(n_children)
Пример
Создадим родительский генератор с фиксированным зерном и породим от него один дочерний генератор:
import numpy as np
rng = np.random.default_rng(0)
child = rng.spawn()
arr_parent = rng.integers(0, 10, size=5)
arr_child = child.integers(0, 10, size=5)
print("Parent:", arr_parent)
print("Child:", arr_child)
Результат выполнения кода:
Parent: [6 1 9 9 7]
Child: [2 8 9 5 8]
Пример
Создадим несколько дочерних генераторов и проверим, что они выдают разные последовательности:
import numpy as np
rng = np.random.default_rng(42)
children = rng.spawn(3)
for i, gen in enumerate(children):
arr = gen.integers(0, 100, size=4)
print(f"Child {i+1}:", arr)
Результат выполнения кода:
Child 1: [56 84 84 55]
Child 2: [63 34 58 20]
Child 3: [17 78 86 93]
Пример
Покажем, что дочерние генераторы независимы от родительского и друг от друга, даже если созданы в разное время:
import numpy as np
rng = np.random.default_rng(10)
child1 = rng.spawn()
parent_num = rng.integers(0, 10, size=3)
child1_num = child1.integers(0, 10, size=3)
child2 = rng.spawn()
child2_num = child2.integers(0, 10, size=3)
print("Parent:", parent_num)
print("Child1:", child1_num)
print("Child2:", child2_num)
Результат выполнения кода:
Parent: [5 2 9]
Child1: [1 2 4]
Child2: [1 4 7]
Обратите внимание, что последовательности дочерних генераторов различаются, несмотря на то, что второй был создан после того, как родительский генератор уже сгенерировал несколько чисел.
Смотрите также
-
класс
Generator,
который предоставляет интерфейс для генерации случайных чисел -
метод
random,
который генерирует случайные числа в полуинтервале [0.0, 1.0) -
метод
integers,
который генерирует случайные целые числа из заданного диапазона -
метод
normal,
который генерирует числа из нормального распределения