Some chap disse o seguinte:
Qualquer um que tente gerar números aleatórios por meios determinísticos está, é claro, vivendo em um estado de pecado.
Isso sempre significa que você não pode gerar números aleatórios verdadeiros com apenas um computador. E ele disse que quando os computadores tinham o tamanho equivalente a um único microprocessador Intel 8080 (~ 6000 válvulas). Os computadores ficaram mais complexos, e acredito que a afirmação de von Von Neumann pode não ser mais verdadeira. Considere que um algoritmo implementado apenas por software é impossível. Eles rodam em hardware físico. Os verdadeiros geradores de números aleatórios e suas fontes de entropia também são feitos de hardware.
Este fragmento Java colocado em um loop:
file.writeByte((byte) (System.nanoTime() & 0xff));
pode criar um arquivo de dados que eu representei como uma imagem:
Você pode ver a estrutura, mas com muita aleatoriedade também. O interessante é que esse arquivo PNG tem 232 KB de tamanho e ainda contém 250.000 pixels em escala de cinza. O nível de compactação PNG foi máximo. Isso é apenas uma taxa de compressão de 7%, ou seja. razoavelmente não compressível. O que também é interessante é que o arquivo é único. Cada geração deste arquivo é um padrão ligeiramente diferente e possui uma compressibilidade semelhante a ~ 7%. Destaco isso porque é fundamental para o meu argumento. Isso é entropia de ~ 7 bits / byte. Isso reduzirá, é claro, com o uso de um algoritmo de compactação mais forte. Mas não reduza a nada próximo de 0 bits / byte. Para obter uma melhor impressão, pegue a imagem acima e substitua o mapa de cores por um aleatório: -
A maior parte da estrutura (na metade superior) desaparece, pois eram apenas sequências de valores semelhantes, mas marginalmente diferentes. Esta é uma verdadeira fonte de entropia criada apenas pela execução de um programa Java em um sistema operacional de múltiplas tomadas? Não é um gerador de números aleatórios uniformemente distribuído, mas a fonte de entropia para um? Uma fonte de entropia construída com software em execução em hardware físico que por acaso é um PC.
Suplementar
Para confirmar que toda imagem gera entropia nova sem um padrão fixo comum a todos, foram geradas 10 imagens consecutivas. Estes foram concatenados e compactados com o arquivador mais forte que consigo compilar (paq8px). Esse processo eliminará todos os dados comuns, incluindo a correlação automática, deixando apenas as alterações / entropia.
O arquivo concatenado compactado para ~ 66%, o que leva a uma taxa de entropia de ~ 5,3 bits / byte ou 10,5Mbits / imagem. Uma quantidade surpreendente de entropia
Suplementar 2
Houve comentários negativos de que minha metodologia de teste de entropia por compressão é falha, fornecendo apenas uma estimativa limitada do limite superior. Portanto, agora eu executei o arquivo concatenado através do teste de avaliação de entropia criptográfica oficial do NIST, SP800-90B_EntropyAssessment . Isso é o melhor possível para a medição de entropia sem IDI. Este é o relatório (desculpe, esta pergunta está ficando longa, mas o problema é complexo): -
Running non-IID tests...
Entropic statistic estimates:
Most Common Value Estimate = 7.88411
Collision Test Estimate = 6.44961
Markov Test Estimate = 5.61735
Compression Test Estimate = 6.65691
t-Tuple Test Estimate = 7.40114
Longest Reapeated Substring Test Estimate = 8.00305
Predictor estimates:
Multi Most Common in Window (MultiMCW) Test: 100% complete
Correct: 3816
P_avg (global): 0.00397508
P_run (local): 0.00216675
Multi Most Common in Window (Multi MCW) Test = 7.9748
Lag
Test: 100% complete
Correct: 3974
P_avg (global): 0.00413607
P_run (local): 0.00216675
Lag Prediction Test = 7.91752
MultiMMC Test: 100% complete
Correct: 3913
P_avg (global): 0.00407383
P_run (local): 0.00216675
Multi Markov Model with Counting (MultiMMC) Prediction Test = 7.9394
LZ78Y Test: 99% complete
Correct: 3866
P_avg (global): 0.00402593
P_run (local): 0.00216675
LZ78Y Prediction Test = 7.95646
Min Entropy: 5.61735
O resultado é que o NIST acredita que eu gerei 5,6 bits / byte de entropia. Minha estimativa de compressão DIY coloca isso em 5,3 bits / byte, um pouco mais conservador.
-> As evidências parecem apoiar a noção de que um computador executando apenas um software pode gerar entropia real. E que von Neumann estava errado (mas talvez correto para o seu tempo).
Ofereço as seguintes referências que podem apoiar minha reivindicação: -
Existem modelos estocásticos de não determinismo na taxa de execução do programa?
Análise WCET de sistemas probabilísticos rígidos em tempo real
Existe um algoritmo de software que pode gerar um padrão de caos não determinístico? e a relevância dos efeitos caóticos.
Paralelos com o princípio da incerteza entrópica quântica
Entrada do blog de Aleksey Shipilёv sobre o comportamento caótico do nanoTime (). Seu gráfico de dispersão não é diferente do meu.
System.nanoTime()
.