使用任何编程语言生成真随机数生成器

时间:2015-07-21 14:49:16

标签: java random

根据文档,java.util.Random不是真正的随机生成器。

从下面的链接:http://docs.oracle.com/javase/7/docs/api/java/util/Random.html,引用了

此类的实例用于生成伪随机数流。该类使用48位种子,使用线性同余公式进行修改。

我必须实现真随机数生成器。请使用任何编程语言或java

建议替代方案

4 个答案:

答案 0 :(得分:3)

您正尝试仅使用确定性算法生成随机数,并在某些编程语言(如java)中显示。无法在确定性设备中创建真正的随机数生成器。

根据确定性的定义,我们知道如果设备配置在相同的状态,它将始终表现出相同的行为。

在真正的随机发生器的特定情况下,该设备将是没有输入和一个输出(所需的随机数)的算法。在这种情况下,确定性算法只能产生相同的数字。因此不是随机的。

伪随机生成器通过存储它们用于产生具有随机性外观的数字序列的内部状态来模仿随机性。从概念上讲,内部状态只是算法的另一个输入,对于相同的内部状态,算法将始终产生相同的输出。虽然这些算法提供了一系列不断变化的数字,但它们根本不是真正随机的,因为它们总是产生相同的数字串。

您可以尝试通过每次使用不同的值初始化此类伪随机算法的内部状态来进一步改进,从而获得不同的随机数流。但这带来了两个问题:

  • 你从哪里获得初始状态?如果您始终使用相同的初始状态,则不会获得不同的数字流。并且尝试以算法方式(因此确定性地)获得随机状态再次成为同样的问题。
  • 即使您从物理来源获得真正的随机初始状态,数字流仍然不是真正随机的。每个数字由先前状态的确定性算法计算。因此,通过检查一长串数字,最终可能知道下一个数字是什么。

实际上可以使用算法创建随机数生成器。您必须使用非确定性算法。但是这样的算法本身需要随机数生成器以便是不确定的。如物理设备或竞争条件。

答案 1 :(得分:1)

真的无法在代码中生成真正的随机数生成器。它必须是随机性的物理来源,即便如此,也有一些关于随机随机被称为真随机的问题。

您可以购买各种USB随机数生成器,您可以插入这些生成器并从应用程序中获取值。

答案 2 :(得分:1)

正如@depperm评论的那样,目前的计算机几乎不可能。这也是一个有趣的哲学问题,“真正随机”的概念是否有意义......

但是如果你想要比伪随机数生成器“更随机”的东西,你可以得到某种“现实世界”的事件。不要向用户询问随机种子 - 人们不善于有意识地“随机”。你可以尝试的一些事情(其中任何一个都可以用来“种子”一个伪随机数发生器):

  • 让用户随机移动鼠标,并勾勒出他们的动作;
  • 检查当前时间的下几位(如毫秒或微秒) - 尽管取决于系统,它们总是0,或者总是16的倍数,或者其他东西)。
  • 从某个地方获取一个号码,例如https://www.random.org(他们使用大气噪音)

-s

答案 3 :(得分:1)

许多现代计算机具有生成真随机数的硬件方法。微处理器通常具有使用反向偏置二极管或一些热噪声放大器来生成随机位并使其白化的指令,然后将它们传递给OS。您还可以购买加密狗插入USB端口并为您生成随机数。

即使系统没有特定的RNG硬件,操作系统也可以从键盘和鼠标时间收集熵,并根据这些提供数字。在Linux和OSX上,您可以使用/ dev / random来访问它。在Windows上,有CryptGenRandom()。一个实施良好的Linux也将使用处理器的原生RNG,但有些可能不会。

除了操作系统外,还有像random.org这样的网络服务,可以根据天气数据生成随机数。