一些小伙子说:
任何试图通过确定性方法生成随机数的人当然都处于犯罪状态。
这总是意味着您不能仅凭计算机生成真正的随机数。他说,当计算机的大小与单个Intel 8080微处理器(约6000个阀)的大小相同时。计算机变得越来越复杂,我相信冯·冯·诺依曼的说法可能不再正确。考虑到仅软件实现的算法是不可能的。它们在物理硬件上运行。真正的随机数生成器及其熵源也由硬件组成。
这个Java片段陷入了循环:
file.writeByte((byte) (System.nanoTime() & 0xff));
可以创建一个我以图像表示的数据文件:
您可以看到结构,但也有很多随机性。有趣的是,此PNG文件的大小为232KB,但包含250,000灰度像素。PNG压缩级别最高。那只是7%的压缩率。相当不可压缩。有趣的是该文件是唯一的。此文件的每一代都是略有不同的模式,并且具有相似的〜7%压缩率。 我强调这一点,因为这对我的论点至关重要。熵约为7位/字节。当然,使用更强大的压缩算法将减少这种情况。但不要减少到0位/字节附近。通过拍摄上面的图像并将其颜色映射表替换为随机的图像,可以产生更好的印象:
大多数结构(在上半部分)消失了,因为它只是具有相似但略有不同值的序列。这是仅通过在多任务操作系统上执行Java程序而创建的真正的熵源吗?不是统一分布的随机数生成器,而是一个的熵源?由在物理硬件上运行的软件构建的熵源,恰好是PC。
补充性
为了确认每个图像都产生新的熵,而没有所有人共有的固定模式,生成了10个连续图像。然后将它们连接起来,并使用我可以编译的最强大的存档器(paq8px)进行压缩。此过程将消除所有通用数据,包括自动关联,仅保留更改/熵。
串联文件被压缩到〜66%,这导致〜5.3位/字节或10.5Mbits /图像的熵率。令人惊讶的熵
补充2
有负面评论认为我的压缩测试方法的熵是有缺陷的,仅给出了一个松散的上限估计。因此,现在我通过NIST的官方加密熵评估测试SP800-90B_EntropyAssessment运行了级联文件。这与非IID熵测量一样好。这是报告(很抱歉,这个问题越来越长,但是问题很复杂):-
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
结果是NIST相信我已经产生了5.6位/字节的熵。我的DIY压缩估算结果为5.3位/字节,稍微保守一些。
->证据似乎支持这样一种观点,即仅运行软件的计算机就可以产生真实的熵。冯·诺依曼(Ver Neumann)错了(但也许对他的时间来说是正确的)。
我提供以下可能支持我的主张的参考:
是否存在可以生成非确定性混沌模式的软件算法?以及混沌效应的相关性。
与量子熵不确定性原理平行
AlekseyShipilёv 关于nanoTime()的混沌行为的博客条目。他的散点图和我的没什么不同。
System.nanoTime()
。