Fortuna ou Mersenne Twister é preferível como um RNG algorítmico?


19

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.


6
PRNGs criptográficos tendem a ser muito mais lentos que a maioria dos outros PRNGs; se você estiver fazendo uma simulação de Monte Carlo em que suas operações PRNG cheguem aos milhões, você encontrará métodos criptográficos muito caros.
JM

11
@JM - Com um pouco mais de detalhes, acho que seu comentário seria bom como resposta. Certamente seria interessante verificar se a funcionalidade criptográfica acelerada por hardware moderno poderia ser usada para criar um fluxo de alto desempenho de números pseudo-aleatórios criptograficamente seguros.
Mark Booth

@JM disse que RNGs criptográficos são lentos - marca contra Fortuna
winwaed

aqui está uma boa lista de PRNGs e muitas estatísticas diferentes que você pode achar úteis, espero que ajude> boost.org/doc/libs/1_48_0/doc/html/boost_random/…
pyCthon

Meu problema com o cstdlib foi a granularidade - apenas RAND_MAX=32768valores 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.
22412 bobobobo

Respostas:


14

Bem, tudo é uma troca de um tipo ou de outro. Para geradores de números aleatórios, agrupo-os em 3 categorias básicas:

  1. Bom o suficiente para trabalhos de casa.
  2. Bom o suficiente para apostar em sua empresa.
  3. Bom o suficiente para apostar no seu país.

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.


2
Percorrendo rapidamente a versão imprimível do artigo , a "figura 4" parece ser um código em vez de uma imagem. A "Figura 5" parece excelente, mas esta é a imagem que obtive do WayBack Machine .
JM

Obrigado. Parece que a velocidade é uma marca contra Fortuna neste caso. Ré. Baralhamento ruim: sim, eu sei o suficiente (não muito!) Que é fácil "desfazer" a aleatoriedade de um RNG - por exemplo, escolhendo uma semente inicial ruim.
Win11

Outra versão com melhores fotos é em: cigital.com/papers/download/developer_gambling.php
Tangurena

11
LCGs de 96 bits com saídas de 32 bits passam por mais testes estatísticos que o Mersenne Twisters. Hoje em dia, ninguém deve usar um Mersenne Twister, pois é tão fácil criar PRNGs não criptográficos decentes que são muito melhores que o MT em todos os aspectos significativos.
Veedrac

4

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.)


O / dev / urandom é seguro para criptografia no linux e no free-bsd. Veja esta resposta
Adam Kurkiewicz

Para simulações, por que seria um recurso desejável que números aleatórios fossem verdadeiros? Certamente, alguns geradores de números pseudo-aleatórios são piores, mas outros serão iguais para todos os propósitos práticos. Então, por que você considera a veracidade como um bom recurso em si?
Wrzlprmft

2

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.


0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.