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

时间:2013-08-19 15:16:39

标签: java scala random

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

由于我需要更多的方法,我想使用那些珍贵的TRN,我可以获得java.util.Random(或scala.util.Random)的种子。我也总是选择一个新的来生成下一个随机数。

所以我想我的问题是: 我从Java中的Random实例生成的数字可以被认为是真正随机的,因为种子是真正随机的吗? 真正的随机性是否仍然存在不满足的条件? 如果我继续增加等级,随机性会丢失吗? 或者(正如我想到的那样)只要种子流是真的随机的?

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

当你拿出更多的东西,而不是你已经放入它们肯定不再真正随意。如果随机数生成器不好,甚至可能更早发生断点。通过考虑序列的熵可以看出这一点。种子值完全确定序列,因此最多的序列与种子值一样多。如果它们都是不同的,则熵与种子的熵相同(基本上是种子位的数量,假设种子是真正随机的)。

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

但是为什么要关心你是否将它用于安全目的?你确定伪随机数对你的应用来说还不够好吗?

答案 2 :(得分:1)

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

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

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

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

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