关于scala:真正失去随机性的是什么?真随机数作为java.util.random种子?

At what point is True randomness lost? True random number as a java.util.Random seed?

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

因为我需要的远不止我想用的那些宝贵的trn,我可以作为java.uti.random(或scala.uti.random)的种子。我也会选择一个新的随机数来生成下一个随机数。

所以我想我的问题是:从Java中的随机实例生成的数字是否真的是随机的,因为种子真的是随机的吗?是否仍然存在不符合真正随机性的条件?如果我继续增加水平,什么时候会失去随机性?或者(就像我想到的那样)只要种子流是随机的?

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


对于像java.util.Random这样的伪随机生成器,如果序列中只有几个数字,那么序列中的下一个生成的数字将变得可预测,因此您将很快失去"真正的随机性"。最好使用java.security.SecureRandom提供的一个生成器——这些都是具有很长序列长度的强随机生成器,应该很难预测。


我们的Java随机给出均匀分布的随机数。这不是真正的随机性,它可能产生5倍于同一个数字的结果。

此外,对于每个特定的种子,都会生成相同的序列(有意)。2^64种子一般不相关。(注意,黑客可以存储每个序列的前十个数字,从而快速赶上。)

所以,如果你每隔一段时间使用一个真正的随机数作为种子,你会在这段时间内得到一个均匀的分布。实际上与不使用真正的随机数发生器没有很大的不同。

现在组合随机序列可能会减少随机性。也许将真正的随机数转换成字节,然后用另一个字节对每个新的随机数进行异或运算,会产生更大的差异。

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


当你取出的比特数超过你放入的比特数时,它们肯定不再是真正随机的。如果随机数生成器不好,则断点甚至可能更早出现。这可以通过考虑序列的熵来看到。seed值完全决定序列,因此最多有seed值那样多的序列。如果它们都是不同的,那么熵与种子的熵是相同的(假设种子是真正随机的,那么基本上就是种子位的数量)。

然而,如果不同的种子产生相同的伪随机序列,则序列的熵将低于种子的熵。如果我们切断N位之后的序列,熵可能会更低。

但是为什么不把它用于安全目的呢?您确定伪随机数对您的应用程序来说不够好吗?