真正的随机性在什么时候丢失?真随机数作为java.util.random种子?

真正的随机性在什么时候丢失?真随机数作为java.util.random种子?,java,scala,random,Java,Scala,Random,让我们假设我有一个可靠的真正随机的随机数源,但它非常慢。它每两个小时只给我几百个数字 因为我需要的远不止这些,所以我一直在考虑使用这些珍贵的TRN作为java.util.Random(或scala.util.Random)的种子。我也总是会选择一个新的来生成下一个随机数 所以我想我的问题是: 我从Java中的那些随机实例生成的数字是否可以被认为是真正随机的,因为种子是真正随机的? 对于真正的随机性,是否仍然存在不满足的条件? 如果我继续增加水平,随机性会在什么时候消失? 或者(正如我想到的那样)

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

因为我需要的远不止这些,所以我一直在考虑使用这些珍贵的TRN作为java.util.Random(或scala.util.Random)的种子。我也总是会选择一个新的来生成下一个随机数

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


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

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

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


但是,如果你不出于安全目的使用它,为什么还要在意呢?您确定伪随机数对于您的应用程序来说不够好吗?

我们的java random提供均匀分布的随机数。这不是真正的随机性,它可能产生五倍于同一数字的随机性

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

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

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


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

对于像
java.util.random
这样的伪随机生成器,序列中的下一个生成的数字会变得可预测,只要序列中有几个数字,所以你会很快失去“真正的随机性”。最好使用java.security.SecureRandom提供的生成器之一-这些都是序列长度很长的强随机生成器,应该很难预测。

据我所知,“可靠的真正随机”到底是什么意思,真正的随机性是不可能通过编程推导出来的。我不是在推导它。我从一个实验中得到我的随机数。。。只是速度太慢了!然后我想用这些TRN生成其他TRNFTR,它仍然是伪随机的。我的问题更多的是好奇,而不是实际应用。我只是想知道这在哪一点上不再有效。你能详细说明你答案的第一部分吗?我已经扩展了答案。那么在j.u.Random或j.s.SecureRandom中有种子的“碰撞”吗?或者有关于使用这些实现的冲突(不同的种子给出相同的序列)的统计数据吗?我不知道,这需要对使用的算法进行详细的研究。有趣的是。。。非常感谢,我会尝试做一些关于这方面的研究。我得到了尽可能多的j.u.随机实例。每次我需要生成一个新的数字时,我都会选择一个新的实例。那个系统不会提供真正的随机性吗?均匀分布并不意味着你不能连续五次拥有相同的数字。@le_douard是的,than具有很好的随机性。