我想我似乎已经成功地创建并测试了一个非常简单的脚本,当在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的应用程序,那么有没有人知道为什么依赖这个脚本是错误的呢?
发布于 2014-01-27 11:14:23
你所说的“真随机数生成器”是什么意思还不是很清楚,但你的代码肯定不是。这显然取决于您的系统运行一百万次for循环所需的时间,而一个真正的随机数不会有任何这样的依赖关系。
正如您从上面的输出中所看到的,此脚本似乎工作得很好。
这句话没有多大意义。您只显示了生成器的5个输出,大概可以提供大约200万个可能的输出。请参阅here for example.
这里有几个堆栈溢出问题,它们也提供了一些见解,但主要的结论是,随机数测试可能比你想象的要难得多,“真”随机数生成器仅在软件中是不可能的:
How to test randomness (case in point - Shuffling)
How to unit test a pseudo random number generator?
所以,总而言之,回答你的问题:
如果我正在创建一个严重依赖于高质量TRNG的应用程序,有没有人知道为什么依赖这个脚本可能是一个错误的原因?
主要原因是你没有证明它是真正的随机的。我的猜测是,如果您在此代码上运行一些测试,您会发现某些范围的值会比其他范围的值更频繁地出现。这足以被认为不是随机的,也足以拒绝它。
https://stackoverflow.com/questions/21371267
复制相似问题