Essa questão está relacionada principalmente a um problema prático de engenharia de software, mas eu ficaria curioso para saber se os teóricos poderiam fornecer mais insights sobre isso.
Simplificando, eu tenho uma simulação de Monte Carlo que usa um gerador de números pseudo-aleatórios e gostaria de paralelá-la para que haja 1000 computadores executando a mesma simulação em paralelo. Portanto, preciso de 1000 fluxos independentes de números pseudo-aleatórios.
Podemos ter 1000 fluxos paralelos com as seguintes propriedades? Aqui deve ser um PRNG muito conhecido e amplamente estudado, com todos os tipos de boas propriedades teóricas e empíricas.
Os fluxos são comprovadamente tão bons quanto o que eu obteria se simplesmente usasse o e dividisse o fluxo gerado pelo em 1000 fluxos.
Gerando o próximo número em qualquer fluxo é (quase) tão rápido quanto gerar o próximo número com .
Em outras palavras: podemos obter múltiplos fluxos independentes "de graça"?
Obviamente, se simplesmente usamos , descartando sempre 999 números e escolhendo 1, certamente teríamos a propriedade 1, mas perderíamos no tempo de execução pelo fator 1000.
Uma idéia simples seria usar 1000 cópias de , com sementes 1, 2, ..., 1000. Isso certamente seria rápido, mas não é óbvio se os fluxos tiverem boas propriedades estatísticas.
Depois de pesquisar no Google, encontrei, por exemplo, o seguinte:
A biblioteca SPRNG parece ter sido projetada exatamente para esse fim e suporta vários PRNGs .
O twister de Mersenne parece ser um PRNG popular hoje em dia, e eu encontrei algumas referências a uma variante capaz de produzir múltiplos fluxos em paralelo.
Mas tudo isso está tão longe das minhas próprias áreas de pesquisa, que não consegui descobrir o que é realmente o estado da arte e quais construções funcionam bem não apenas na teoria, mas também na prática.
Alguns esclarecimentos: não preciso de nenhum tipo de propriedades criptográficas; isto é para computação científica. Vou precisar de bilhões de números aleatórios, para que possamos esquecer qualquer gerador com um período .
Edit: Não consigo usar um RNG verdadeiro; Eu preciso de um PRNG determinístico. Em primeiro lugar, ajuda muito na depuração e torna tudo repetível. Em segundo lugar, ele permite que eu faça, por exemplo, encontrar medianas de maneira muito eficiente, explorando o fato de que posso usar o modelo de múltiplas passagens (consulte esta pergunta ).
Edit 2: Existe uma pergunta intimamente relacionada @ StackOverflow: Gerador de números pseudo-aleatórios para ambiente de cluster .