Uma resposta recente mencionou o uso de Fortuna ou Mersenne Twister Random Number Generators ( RNGs ) para semear uma simulação de Monte Carlo . Eu nunca tinha ouvido falar de Fortuna antes, então procurei - parece que ele se destina principalmente ao uso criptográfico.
Atualmente, uso um Mersenne Twister no código de produção para propagar um algoritmo K-Means.
Qual (Fortuna ou Mersenne Twister) é considerado o melhor para aplicações de "semeadura algorítmica" (por exemplo, semeadura de Monte Carlo e K-Means)? Ou é um "empate" - ou seja, use o mais conveniente.
De onde estou sentado, o "melhor" deve fornecer números aleatórios da mais alta qualidade, operar rapidamente e (possivelmente) ter um baixo consumo de memória. Destes, a qualidade é provavelmente a mais importante para a maioria de nós.
fonte
RAND_MAX=32768
valores possíveis. Atualmente, estou usando MT para Monte Carlo raytracing sim. No entanto, eu não vejo o MT como um gargalo de desempenho no meu criador de perfil, provavelmente porque sou uma geração "aleatória" de coisas como direções de raios como um pré-processo . Por exemplo, eu posso gerar uma matriz de 100.000 raios na inicialização, armazená-los em uma matriz e selecionar aleatoriamente a posição inicial da matriz no tempo de execução (executando para 10.000 raios ou mais da coleção). Isso tem uma sobrecarga de memória relativamente alta, em troca de boas distribuições de números aleatórios.Respostas:
Bem, tudo é uma troca de um tipo ou de outro. Para geradores de números aleatórios, agrupo-os em 3 categorias básicas:
Os PRNGs congruenciais lineares (o método geralmente implementado na maioria das bibliotecas) estão solidamente na categoria 1. Fortuna e Mersenne Twister estão solidamente na categoria 2.
Para um artigo interessante sobre como desarrumar um algoritmo de embaralhamento pode custar sua empresa / cassino, recomendo este de 1999 . Devido à podridão do link, as imagens desaparecem, mas a figura 4, aquela em que você plota o próximo número fora do PRNG contra o número anterior gerado, é um conjunto de linhas paralelas.
Como JM aponta, Fortuna é lento. Como você apontou, Mersenne Twister é razoavelmente rápido.
fonte
A escolha padrão na categoria "criptográfica" é Blum-Blum-Shub , eu acho. Como a página da wikipedia já diz, isso não é adequado para simulações porque é muito lento.
Se você estiver executando em um sistema unix, considere também obter seus números aleatórios diretamente de / dev / urandom , o serviço do sistema operacional que fornece números aleatórios de boa qualidade (embora não necessariamente criptografados). Dependendo do sistema operacional em particular que você está usando, isso pode usar o algoritmo Yarrow - do qual Fortuna é uma variante. Mas o aspecto mais interessante é que o sistema operacional tem acesso a alguns números aleatórios verdadeiros: ruído térmico de sensores de temperatura internos, por exemplo. Normalmente, esses dados são misturados no pool aleatório sempre que estiverem disponíveis para manter os dados imprevisíveis.
Esse conceito de mistura aleatória sugere que talvez seja possível obter o melhor dos dois mundos da seguinte maneira. Use um gerador de números aleatórios de qualidade mais rápida e razoavelmente boa, como Mersenne, como seu RNG básico. Mantenha também um segundo gerador de números aleatórios de melhor qualidade - por exemplo, Fortuna. Cada número, digamos 25, executa uma iteração do melhor RNG e adiciona o resultado ao estado do seu RNG básico. Dessa forma, você obteria desempenho bastante alto e resultados de alta qualidade. (Eu acho que seria inútil para criptografia, porque a força desse gerador composto pode muito bem ser a força do link mais fraco. Mas, para simulações, nas quais você normalmente não tem um adversário malicioso, pode funcionar.)
fonte
Eu queria entrar em cena para dizer que, recentemente, passei por esse processo com uma simulação e devo observar que o uso do Fortuna não está fora de questão, se for realmente necessário. No nosso caso, estávamos preocupados que a entropia do MT não fosse alta o suficiente, o que se traduziria em nossa simulação em um viés. Então, para a nossa simulação, usamos o Fortuna puxando cerca de 65 bilhões de números aleatórios desse algo. Os computadores são rápidos, se você realmente precisar, pode usá-lo se tiver um motivo. Se você está apenas fazendo algo como uma integração monte carlo, fique com o MT.
fonte
Acho que a resposta depende muito do aplicativo que você pretende que o RNG seja usado. Eu sugeriria uma quarta categoria para a classificação aproximada de Tangurena: "Bom sem ganho real".
Para muitas aplicações, isso pode simplesmente não importar, e um RNG de grau criptográfico adequado pode simplesmente atrasar suas tarefas sem nenhum ganho proporcional de validade. Por exemplo, grande parte da pesquisa que faço apenas exige muitos milhões de números provenientes de uma distribuição especificada. Quase todo RNG fará, então tudo o que preciso é de um que não seja tão catastroficamente pobre que seja inútil como um RNG. Qualquer outra coisa é simplesmente diminuir o trabalho desnecessariamente. Costumo usar Mersenne Twister, mas isso é simplesmente porque funciona bem o suficiente, eu tenho o código e é razoavelmente rápido.
fonte