我认为我似乎已经成功创建并测试了一个非常简单的脚本,该脚本在Windows VPS上运行时可用作真随机数生成器的构建块。因此,我想知道,如果这很容易,那么伪随机数发生器有什么意义呢?
这是脚本。
#! /usr/bin/perl
use Time::HiRes qw(gettimeofday);
($seconds, $microseconds[0]) = gettimeofday;
for ($count = 1; $count <= 1000000; $count++)
{
}
($seconds, $microseconds[1]) = gettimeofday;
$difference = $microseconds[1] - $microseconds[0];
print "Content-type:text/html\n\n";
print "$difference";
典型输出:
46980个
-953586
47168个
67242个
59319
从上面的输出可以看出,这个脚本似乎运行得很好。
这个脚本在具有非常快的CPU的专用服务器上是否也能正常工作? VPS服务器上的时间特别不稳定吗?这个脚本在所有Windows系统上都能正常工作吗?
如果我创建的应用程序严重依赖于高质量的TRNG,那么任何人都可以看到为什么依赖此脚本可能是错误的原因吗?
答案 0 :(得分:1)
“真随机数生成器”的含义并不完全清楚,但您的代码肯定不是一个。它显然取决于系统运行一百万次for循环所需的时间,而一个真正随机的数字则没有任何这样的依赖。
从上面的输出可以看出,这个脚本似乎运行得很好。
这句话现在没有多大意义。您只显示了发电机的5个输出,可能提供大约200万个可能的输出。已经制定了一系列标准测试来确定RNG是否工作良好 - 主要是因为这种RNG的测试是微妙和困难的 - 眼睛测试是不够的。见here for example.
以下是一些stackoverflow问题,也提供了一些见解,但主要的一点是,随机数测试可能比你想象的要难得多,并且“真正的”随机数生成器在单独的软件中是不可能的:
How to test randomness (case in point - Shuffling)
How to unit test a pseudo random number generator?
总而言之,回答你的问题:
如果我创建的应用程序严重依赖于高质量的TRNG,那么任何人都可以看到为什么依赖此脚本可能是错误的原因吗?
主要原因是你没有证明它是真正随机的。我的猜测是,如果你要对这段代码进行一些测试,你会发现某些值的范围会比其他值更频繁地出现。这足以被认为不是随机的,足以拒绝它。