Eu usei MT19937
em um equipamento de teste para gerar valores [0, - 1] de 32 bits uniformemente (não assinados) , com base na implementação mt19937.c do Authors original , para gerar um suprimento (essencialmente inesgotável) de fluxo estatisticamente aleatório de octetos de bits. Isso substitui um CSPRNG, que não é necessário para esses testes específicos. No entanto, recentemente estive considerando os PRNGs - não por causa das propriedades estatísticas como tais (ambos parecem mais do que adequados para minhas necessidades) - mas eles parecem sugerir uma implementação mais eficiente.WELL
Eu não tenho o conhecimento matemático dos trabalhos acadêmicos, embora eu pudesse pelo menos seguir a matriz de 'torção' e a transformação de têmpera para o primeiro. No entanto, grande parte do código fornecido pelos autores das WELL-n
funções parece se concentrar na geração de ponto flutuante, com algumas constantes mágicas de ponto flutuante (por exemplo, 2.32830643653869628906e-10
). As etapas podem ser omitidas no WELL
código para fornecer uma distribuição uniforme de 32 bits? Ou o algoritmo foi projetado / tendencioso especificamente para distribuições de ponto flutuante?
Ou eu estou errado ao pensar que WELL
trará um ganho de desempenho para a geração vetorial em massa do uint32, satisfazendo meus requisitos?
fonte
PCG
RNGs. Eles são muito mais rápidos, podem fornecer períodos muito longos (bem como múltiplos fluxos) com propriedades estatisticamente excelentes e parecem se recuperar muito rapidamente de IVs ruins.Respostas:
Eu imagino que a maioria dos usuários de geradores de números aleatórios esteja interessada em valores de ponto flutuante. É por isso que o Fast Mersenne Twister orientado a SIMD de dupla precisão (dSFMT) existe. No entanto, há um código C mais recente para o WELL RNG que retorna
unsigned long
valores. Observando o código, parece que a versão anterior estava sendo lançadaunsigned long
paradouble
que você possa descobrir o que eles estavam fazendo comparando as duas.Se você se preocupa principalmente com a velocidade, não acho que esse seja o PRNG para você. A velocidade / desempenho a que os autores se referem não é a rapidez com que o algoritmo gera variáveis aleatórias, mas a rapidez com que ele se recupera de uma inicialização ruim . Isso melhora as propriedades estatísticas do gerador WELL. Consulte a seção 6 da tese de mestrado de Mutsuo Saito (PDF) para obter detalhes sobre o que isso significa. Esses testes são realizados com estados iniciais artificiais de pior caso, portanto, não está claro para mim qual é o efeito em uso geral.
A geração aleatória de números pode ser bastante cara - geralmente apesar da intuição - e é um excelente candidato para otimização, desde que seu código gaste um tempo razoável produzindo valores aleatórios. Em meus próprios testes de desempenho simples (Retina MacBook Pro, OS X 10.9), descobri que o WELL RNG era cerca de um terço mais rápido que o Fast Mersenne Twister (SFMT) orientado a números inteiros atual ao produzir
uint32
valores.SFMT
também tem suporte parauint64
. Eu também achei o clássicomt19937ar.c
código para ser cerca de metade da velocidade comoSFMT
.fonte