В документации NumPy по параллельному генерированию случайных чисел показано, как используйте SeedSequence для создания семян внуков (см. ниже).
from numpy.random import SeedSequence, default_rng ss = SeedSequence(12345) # Spawn off 10 child SeedSequences to pass to child processes. child_seeds = ss.spawn(10) streams = [default_rng(s) for s in child_seeds]
Дочерние объекты SeedSequence также могут порождаться для создания внуков и т. Д. Каждая SeedSequence занимает свою позицию в дереве порожденных объектов SeedSequence, смешанных с предоставленными пользователем начальными числами, чтобы генерировать независимые (с очень высокой вероятностью) потоки.
grandchildren = child_seeds[0].spawn(4) grand_streams = [default_rng(s) for s in grandchildren]
Мой вопрос:
Следует ли мне использовать для создания следующего поколения семян:
great_grandchildren = grandchildren[0].spawn(4)
great_grand_streams = [default_rng(s) for s in great_grandchildren]
или он должен всегда ссылаться на child_seeds[0]
:
great_grandchildren = child_seeds[0].spawn(4)
great_grand_streams = [default_rng(s) for s in great_grandchildren]
Контекст моего вопроса касается реализации начальных значений и функции, состоящей из объекта concurrent.futures.ProcessPoolExecutor
, который использует начальные числа для каждого процесса в сценарии цикла while, который может быть бесконечным. Я хотел бы знать, является ли приведенный ниже правильный способ создания семян из SeedSequence
при условии, что я уже использовал термины grandchildren
и grand_streams
, упомянутые в примере NumPy. Например:
from numpy.random import SeedSequence, default_rng
ss = SeedSequence(12345)
# Spawn off 10 child SeedSequences to pass to child processes.
child_seeds = ss.spawn(10)
streams = [default_rng(s) for s in child_seeds]
run_func1( streams ) #child_seeds is consummed
grandchildren = child_seeds[0].spawn(4)
grand_streams = [default_rng(s) for s in grandchildren]
while True:
run_concurrent_futures_ProcessPoolExecutor_func( grand_streams )
if condition_not_met:
grandchildren = grandchildren[0].spawn(4) #Do I use grandchildren[0] or child_seeds[0] to ensure randomness?
grand_streams = [default_rng(s) for s in grandchildren]
else:
break