有Random
类
public Random()
public Random(long seed)
根据oracle的第二个构造函数的描述为
使用单个长种子创建新的随机数生成器。种子是伪随机数生成器的内部状态的初始值,它由方法next(int)维护。
我完全不明白。我没有找到任何明确解释为什么, 以及 的文章/书籍。
请问任何人解释一下吗?
答案 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;如果您使用相同的种子而不管它何时不会更改,请创建一个数字。但是如果你选择第一种方法,那么一旦运行就会修改数字!