Testando algoritmos aleatórios de geração de variáveis

Respostas:

9

O Diehard Test Suite é algo próximo ao Golden Standard para testar geradores de números aleatórios. Ele inclui vários testes nos quais um bom gerador de números aleatórios deve produzir resultados distribuídos de acordo com alguma distribuição conhecida com a qual o resultado usando o gerador testado pode ser comparado.

EDITAR

Preciso atualizar isso, pois não estava exatamente certo: o Diehard ainda pode ser usado muito, mas não é mais mantido e não é mais o estado da arte. O NIST criou um conjunto de testes aprimorados desde então.

Benjamin Bannier
fonte
9

Apenas para acrescentar um pouco à resposta da buzina, o Diehard Test Suite (desenvolvido por George Marsaglia) é o teste padrão para o PRNG.

Há uma boa biblioteca Diehard C que fornece acesso a esses testes. Além dos testes padrão da Diehard, também fornece funções para alguns outros testes PRNG que envolvem (entre outras coisas) a verificação da ordem dos bits. Há também uma facilidade para testar a velocidade do RNG e escrever seus próprios testes.

Há uma interface R na biblioteca do Dieharder, chamada RDieHarder :

library(RDieHarder)
dhtest = dieharder(rng="randu", test=10, psamples=100, seed=12345)
print(dhtest)

Diehard Count the 1s Test (byte)

       data:  Created by RNG `randu' with seed=12345, 
              sample of size 100 p-value < 2.2e-16

Isso mostra que o gerador RANDU RNG falha no teste de distância mínima / 2dsphere.

csgillespie
fonte
8

Para testar os números produzidos por geradores de números aleatórios, os testes de Diehard são uma abordagem prática. Mas esses testes parecem meio arbitrários e pode-se ficar pensando se mais deve ser incluído ou se existe alguma maneira de realmente verificar a aleatoriedade.

O melhor candidato para a definição de uma sequência aleatória parece ser a aleatoriedade de Martin-Löf . A idéia principal para esse tipo de aleatoriedade, maravilhosamente desenvolvida na seção 3.5 de Knuth, é testar a uniformidade de todos os tipos de sub sequências da sequência de números aleatórios. Conseguir que todo o tipo de definição de subsequências tenha se tornado realmente difícil, mesmo quando se usa noções de computabilidade.

Os testes de Diehard são apenas algumas das subsequências possíveis que se pode considerar e sua falha excluiria a aleatoriedade de Martin-Löf.

Hbar
fonte
4

Você não pode provar, porque é impossível; você só pode verificar se não há autocorrelações ou perturbações de distribuição embaraçosas e, de fato, Diehard é um padrão para isso. Isso é para estatística / física, os criptografadores também verificarão principalmente (entre outras coisas) o quão difícil é ajustar o gerador aos dados para obter os valores futuros.


fonte
4

Pequena correção no post de Colin: o pacote CRAN RDieHarder é uma interface para o DieHarder , a reescrita / extensão / revisão de Diehard feita por Robert G. Brown (que gentilmente me lista como co-autor com base nos meus invólucros RDieHarder) com recente contribuição de David Bauer.

Entre outras coisas, o DieHarder inclui a bateria de testes do NIST mencionada no post de Mark, além de alguns novos. Esta é uma pesquisa em andamento e já existe há algum tempo. Eu dei uma palestra no useR! 2007 sobre o RDieHarder, que você pode obter daqui .

Dirk Eddelbuettel
fonte
3

Raramente é útil concluir que algo é "aleatório" no abstrato. Com mais freqüência, você deseja testar se ele possui um certo tipo de estrutura aleatória. Por exemplo, você pode querer testar se algo tem uma distribuição uniforme, com todos os valores em um determinado intervalo igualmente prováveis. Ou você pode querer testar se algo tem uma distribuição normal, etc. Para testar se os dados têm uma distribuição específica, você pode usar um teste de adequação, como o teste do qui quadrado ou o teste de Kolmogorov-Smirnov.

John D. Cook
fonte
3

Existem duas partes para testar um gerador de números aleatórios. Se você está interessado apenas em testar um gerador uniforme, então sim, algo como o conjunto de testes DIEHARD é uma boa ideia.

Mas muitas vezes você precisa testar a transformação de um gerador uniforme. Por exemplo, você pode usar um gerador uniforme para criar valores distribuídos exponencialmente ou normalmente. Você pode ter um gerador uniforme de alta qualidade - digamos que tenha uma implementação confiável de um algoritmo conhecido como o Mersenne Twister - mas precisa testar se a saída transformada tem a distribuição correta. Nesse caso, você precisa fazer algum tipo de teste de ajuste de qualidade, como Kolmogorov-Smirnov. Mas para iniciantes, você pode verificar se a média e a variação da amostra têm os valores esperados.

A maioria das pessoas não escreve - e não deveria - escrever seu próprio gerador de números aleatórios uniforme. É difícil escrever um bom gerador e fácil enganar-se a pensar que você escreveu um bom gerador quando não o fez. Por exemplo, Donald Knuth conta a história no volume 2 do TAOCP de um gerador de números aleatórios que ele escreveu que acabou sendo péssimo. Mas é comum que as pessoas tenham que escrever seu próprio código para produzir valores aleatórios a partir de uma nova distribuição.

John D. Cook
fonte
2

O NIST publica uma lista de testes estatísticos com uma implementação de referência em C.

Há também o TestU01 de algumas pessoas inteligentes, incluindo o respeitado pesquisador do PRNG Pierre L'Ecuyer. Novamente, há uma implementação de referência em C.

Como apontado por outros comentaristas, estes são para testar a geração de bits pseudo-aleatórios. Se você transformar esses bits em uma variável aleatória diferente (por exemplo, transformação de Box-Muller de uniforme em Normal), precisará de testes adicionais para confirmar a correção do algoritmo de transformação.

Mark M. Fredrickson
fonte