Random(long)构造函数有什么用?

时间:2015-07-09 16:08:33

标签: java random

Random

的2个构造函数
  1. public Random()
  2. public Random(long seed)
  3. 根据oracle的第二个构造函数的描述为

    使用单个长种子创建新的随机数生成器。种子是伪随机数生成器的内部状态的初始值,它由方法next(int)维护。

    我完全不明白。我没有找到任何明确解释为什么 以及 的文章/书籍。

    请问任何人解释一下吗?

5 个答案:

答案 0 :(得分:10)

如果将构造函数与种子一起使用,您将获得可重复的序列,因此它有利于测试。如果你使用没有种子的构造函数,你就不会知道将产生什么类似随机数的序列。

答案 1 :(得分:8)

伪随机数生成器通过基于先前生成的数重复生成新数来工作。这意味着如果你总是拥有相同的第一个"随机"数字,并且您使用相同的伪随机数生成器生成第二个,您将始终具有相同的第二个"随机"数字也是如此。

第一个Random构造函数构造一个带有非确定种子的伪随机数生成器(序列中的第一个数字),因此您几乎总是会得到一个不同的序列" random&#34 ;数字。第二个Random构造函数用你想要的种子构造一个伪随机数生成器,所以如果给它相同的种子,你总会得到相同的序列。

这是一个例子。如果您创建Random,请执行以下操作:

Random yourRandom = new Random();

它将从一些种子开始。那种子可能是42,121,3810,无论如何。您永远无法确定何时创建它。它生成的所有随机数都是基于该种子的,所以因为它几乎总是使用不同的种子,所以你几乎总是会得到不同的随机数"数字出来了。

另一方面,如果你改为创建一个Random

Random yourOtherRandom = new Random(36);

生成的所有数字yourOtherRandom将从36开始计算。由于第一个数字(36)相同,第二个数字是从第一个数字计算的,等等,所有yourOtherRandom生成每次运行程序时都会一样。

答案 2 :(得分:3)

这是一个有趣的! 随机数生成根本不是随机的。如果您使用相同的种子并询问它是否有一堆随机数,您将获得相同的序列。这很重要,因为它允许不同的计算机可预测地生成相同的序列,只要它们共享种子即可。 如果您未指定种子,则会为您选择一个种子,这种方法很可能不被世界上任何其他VM选择。但是,如果有人猜测你使用的种子,他们将能够生成相同的数字序列。

来自Google搜索:Random search

答案 3 :(得分:0)

Random生成器是Pseudorandom number generator。这意味着它实际上不是一个随机数生成器,而只是一些聪明的算法,它产生完全确定的数字,只是看起来像随机

当使用生成器时,每次生成一个随机数时,它会修改其内部状态,以便在下次调用时产生不同的数字。但是,在开始时,必须初始化此算法的内部状态,并且用于此初始化的值通常称为seed。无参数构造函数根据系统时间自行生成种子,而另一个构造函数允许您放置种子,这允许您使其可重复 - 相同的种子(和相同的生成器)将生成相同的数字序列

如果您感兴趣,here是OpenJDK的Random类的源代码(即Java的开源实现,但它应该在功能上等效)。 seed的构造函数位于第135行,setSeed方法位于第168行,例如nextInt方法位于第328行,它只调用第198行的私有方法next,这是所有魔法发生的地方。它还有javadoc,它引用了这种生成器的(可能更多的数学)描述。

答案 4 :(得分:-1)

我想知道你想问的是关于区分默认构造函数和参数构造函数。实例化新的Random对象时,可以对此进行编码:

Random random=new Random();

这样,我们调用默认构造函数,即没有参数构造函数。 但如果你编码:

Random random=new Random(47);

我们调用一个参数为47的构造函数。

类似于C语言;种子将随机地#34;如果您使用相同的种子而不管它何时不会更改,请创建一个数字。但是如果你选择第一种方法,那么一旦运行就会修改数字!