No meu programa, eu preciso executar N threads separados, cada um com seu próprio RNG, que é usado para provar um grande conjunto de dados. Eu preciso ser capaz de propagar todo esse processo com um único valor para poder reproduzir resultados.
É suficiente simplesmente aumentar sequencialmente a semente para cada índice?
Atualmente eu uso numpy
o RandomState
que usa um gerador de números pseudo-aleatórios Mersenne Twister.
Trecho de código abaixo:
# If a random number generator seed exists
if self.random_generator_seed:
# Create a new random number generator for this instance based on its
# own index
self.random_generator_seed += instance_index
self.random_number_generator = RandomState(self.random_generator_seed)
Basicamente, começo com uma semente inserida pelo usuário (se existir) e, para cada instância / thread, adiciono sequencialmente o índice (0 a N-1) da instância em execução. Não sei se isso é uma boa prática ou se existe uma maneira melhor de fazer isso.
Respostas:
Não é uma boa prática, certamente. Por exemplo, considere o que acontece quando você executa duas execuções com sementes de raiz 12345 e 12346. Cada execução terá
N-1
fluxos em comum.As implementações do Mersenne Twister (incluindo
numpy.random
erandom
) geralmente usam um PRNG diferente para expandir a semente inteira no vetor de estado grande (624 inteiros de 32 bits) que o MT usa; essa é a matriz deRandomState.get_state()
. Uma boa maneira de fazer o que você quer é executar esse PRNG, semeado com o número inteiro de entrada uma vez e obterN*624
números inteiros de 32 bits. Divida esse fluxo emN
vetores de estado e useRandomState.set_state()
para inicializar explicitamente cadaRandomState
instância. Pode ser necessário consultar as fontes Cnumpy.random
ou_random
da biblioteca padrão para obter o PRNG (elas são iguais). Não tenho certeza se alguém implementou uma versão autônoma desse PRNG para Python.fonte
RandomState
implementações mais recentes no desenvolvimento que usa um algoritmo que possui fluxos configuráveis. Ou seja, você inicializa cadaRandomState
instância com a mesma semente e IDs de fluxo diferentes (apenas incrementado é bom) e tem fluxos independentes garantidos. pypi.python.org/pypi/randomstatefonte
Agora existe um pacote Python chamado RandomGen que possui métodos para conseguir isso.
Ele suporta fluxos independentes criados a partir de uma única semente, bem como um protocolo de salto para geradores de números aleatórios mais antigos, como o MT19937.
fonte
Algumas pessoas afirmam que existem correlações nos números aleatórios gerados por sementes seqüenciais. /programming/10900852/near-seeds-in-random-number-generation-may-give-similar-random-numbers Não sei ao certo se isso é verdade.
Se você está preocupado com isso, por que não usar um único gerador de números aleatórios para escolher as sementes para todos os outros geradores?
fonte