1

我认为我似乎已经成功地创建并测试了一个非常简单的脚本,当它在 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 的应用程序,那么任何人都可以看到为什么依赖此脚本可能是错误的任何原因吗?

4

1 回答 1

1

目前尚不清楚您所说的“真随机数生成器”是什么意思,但您的代码肯定不是一个。这很明显取决于您的系统运行一百万次 for 循环需要多长时间,而真正的随机数不会有任何这样的依赖关系。

从上面的输出可以看出,这个脚本似乎运行得很好。

就目前而言,这句话没有多大意义。你只展示了你的生成器的 5 个输出,大概可以提供大约 200 万个可能的输出。已经制定了一系列标准测试来确定 RNG 是否运行良好 - 主要是因为对此类 RNG 的测试是微妙而困难的 - 眼睛测试是不够的。例如,请参见此处。

这里有几个 stackoverflow 问题也提供了一些见解,但主要的收获是随机数测试可能比你想象的要困难得多,并且“真”随机数生成器仅在软件中是不可能的:

如何测试随机性(例如 - 洗牌)

如何对伪随机数生成器进行单元测试?

所以,总而言之,回答你的问题:

如果我正在创建一个严重依赖于高质量 TRNG 的应用程序,那么任何人都可以看到为什么依赖此脚本可能是错误的任何原因吗?

主要原因是你没有证明它是真正随机的。我的猜测是,如果您要对此代码运行一些测试,您会发现某些值范围会比其他值更频繁地出现。这足以被认为不是随机的,并且足以拒绝它。

于 2014-01-27T03:14:22.707 回答