3

假设我有一个可靠的、真正随机的随机数源,但它非常慢。它每隔几个小时只给我几百个数字。

由于我需要的远不止这些,我想使用那些我可以作为 java.util.Random(或 scala.util.Random)的种子的宝贵 TRN。我也总是会选择一个新的来生成下一个随机数。

所以我想我的问题是:我从 Java 中的那些 Random 实例生成的数字是否可以被认为是真正随机的,因为种子是真正随机的?是否还有一个条件不满足真正的随机性?如果我继续增加关卡,随机性会在什么时候消失?或者(正如我想出的那样)真的是随机的,只要种子流是随机的?

我假设没有人截获种子流,但我不打算将这些数字用于安全目的。

4

3 回答 3

3

对于像这样的伪随机生成器java.util.Random,只要序列中的几个数字,序列中的下一个生成数字就变得可预测,因此您将很快失去“真正的随机性”。更好地使用由提供的生成器之一java.security.SecureRandom- 这些都是具有非常长序列长度的强随机生成器,这应该很难预测。

于 2013-08-19T15:50:26.780 回答
1

当你取出比你投入更多的比特时,它们肯定不再是真正随机的。如果随机数生成器不好,断点甚至可能更早出现。这可以通过考虑序列的熵来看出。种子值完全决定了序列,所以序列最多和种子值一样多。如果它们都是不同的,则熵与种子的熵相同(本质上是种子比特的数量,假设种子是真正随机的)。

但是,如果不同的种子导致相同的伪随机序列,则序列的熵将低于种子的熵。如果我们在 n 位之后切断序列,熵可能会更低。

但是,如果您不出于安全目的使用它,为什么要关心呢?您确定伪随机数对您的应用程序不够好?

于 2013-08-19T15:24:09.460 回答
1

我们的 java Random 给出了均匀分布的随机数。这不是真正的随机性,它可能会产生相同数字的五倍。

此外,对于每个特定的种子,都会(有意地)生成相同的序列。与 2^64 种子通常无关。(请注意,黑客可以存储每个序列的前十个数字;从而迅速赶上。)

因此,如果您以较大的间隔使用真正的随机数作为种子,您将在该间隔内获得均匀分布。实际上与不使用真正的随机化器没有太大区别。

现在组合随机序列可能会降低随机性。也许将真正的随机数转换为字节,并将每个新的随机数与另一个字节进行异或运算,可能会产生更大的差异。

请不要只相信我的话——我不能保证上述的数学正确性。数学/算法论坛可能会提供更多信息。

于 2013-08-19T15:42:45.243 回答