Inspirado pela Random com as mãos atadas :
O objetivo
O objetivo desse desafio é escrever um programa que gere um fluxo de bits pseudo-aleatório, que é uma sequência de 1s e 0s que parece ser puramente aleatória, mas que na verdade é gerada de maneira determinística. Seu programa deve gerar uma sequência de 1 e 0s (com espaço em branco opcional) e deve passar os seguintes requisitos:
- Com tempo e memória ilimitados, seu programa deve continuar produzindo uma sequência de 1s e 0s para sempre
- Seu programa deve gerar mais de 1000 bits aleatórios em aproximadamente um minuto, em uma máquina razoável. Se esse requisito for impossível, eu o diminuirei.
- A sequência de bits pode se repetir, mas o comprimento da seção de repetição deve ser superior a 1000 bits.
- A sequência de bits deve passar no maior número possível de testes de aleatoriedade (descritos abaixo).
- O programa não deve receber nenhuma entrada de fontes externas ou usar qualquer função rand () integrada.
- Devido ao requisito acima, o programa deve gerar a mesma seqüência exata de bits cada vez que é executado.
Teste de aleatoriedade # 1
A sequência de bits pseudo-aleatórios não deve incluir nenhum padrão óbvio na inspeção visual.
Teste de aleatoriedade # 2 (sujeito a alterações com base nos comentários)
A cadeia de bits deve conter uma distribuição igual de 1s e 0s. Para testar isso (e outras coisas também), o fluxo de bits é dividido em segmentos com 3 bits, como 101|111|001
.
De todos esses segmentos, 1/8 deles deve ter três 1s e nenhum 0s, 3/8 deles devem ter dois 1s e um 0, 3/8 deles devem ter um 1 e dois 0s e 1/8 deles não devem ter 1s e três 0s.
Teste de aleatoriedade # 3
Uma "execução" é definida como uma série consecutiva de bits que todos têm o mesmo valor. A cadeia 1001001110
possui três execuções do tamanho 1 ( 1..1.....0
), duas execuções do tamanho 2 ( .00.00....
) e uma execução do tamanho 3 ( ......111.
). Observe que as execuções não se sobrepõem.
De uma sequência de 1000 bits aleatórios, deve haver cerca de 250 execuções do tamanho 1, 125 execuções do tamanho 2, 62 execuções do tamanho 3, etc. Em geral, para o tamanho da execução R, deve haver aproximadamente 1000/(2**(R+1))
execuções desse tamanho.
Teste de aleatoriedade # 4
Os primeiros 840 bits são divididos em duas metades de 420 bits cada. Cada bit na primeira metade é comparado ao bit correspondente na segunda metade. Os dois bits devem corresponder cerca de cinquenta por cento do tempo.
Aqui está o código fonte de um programa Perl que executa os testes 2 a 4. A partir de agora, ele exige que a sequência de bits não contenha nenhum espaço em branco.
Tempo de critério de vencimento objetivo!
O vencedor é o programa que passa todos os 6 requisitos e todos os testes de aleatoriedade na medida em que é indistinguível da aleatoriedade. Se vários programas conseguirem isso, o que levar mais tempo para repetir vencerá. Se vários programas conseguirem isso, talvez seja necessário encontrar mais testes de aleatoriedade para atuar como desempate.