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

Random类有2个构造函数

  1. public Random()
  2. public Random(long seed)

根据oracle的第二个构造函数的描述为

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

我完全不明白。 我没有找到任何明确解释原因时间方式的文章/书籍。

有人可以解释一下吗?

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

第一个Random构造函数使用非确定种子(序列中的第一个数字)构造一个伪随机数生成器,因此您几乎总是会得到一个不同的“随机”数字序列。 第二个Random构造函数用你想要的任何种子构造一个伪随机数生成器,所以如果你给它相同的种子,你将总是得到相同的序列。

这是一个例子。 如果您像这样创建一个Random

 Random yourRandom = new Random(); 

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

另一方面,如果你创建一个像这样的Random

 Random yourOtherRandom = new Random(36); 

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

如果将构造函数与种子一起使用,您将获得可重复的序列,因此它对测试很有用。 如果使用没有种子的构造函数,则不知道将生成哪种类似随机数的序列。

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

来自Google搜索: 随机搜索

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

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

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

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

 Random random=new Random(); 

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

 Random random=new Random(47); 

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

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