使用当前时间与无时间的随机数发生器

aye*_*ete 6 java random

我想了解使用随机数生成器System.currentTimeMillis()作为种子和使用默认构造函数之间的区别.也就是说,这有什么区别:

Random rand = new Random(System.currentTimeMillis());
Run Code Online (Sandbox Code Playgroud)

还有这个:

Random rand = new Random();
Run Code Online (Sandbox Code Playgroud)

我知道这些数字是伪随机的,但是我还没有完全理解细节,以及它们是如何产生的,在当前时间用作种子时获得的"随机性"水平与使用默认构造函数时.

Ted*_*opp 6

提供自己的种子对于您有意希望多次生成相同的伪随机值序列的模拟非常有用.但是,一般情况下,使用默认构造函数也是如此.

使用默认构造函数时,文档会说:

此构造函数将随机数生成器的种子设置为非常可能与此构造函数的任何其他调用不同的值.

换句话说,它在内部生成自己的种子.细节取决于所使用的特定Java实现.我见过的一个实现有:

private static volatile long seedBase = 0;

public Random() {
    setSeed(System.nanoTime() + seedBase);
    ++seedBase;
}
Run Code Online (Sandbox Code Playgroud)

随机性的实际质量不会改变.如果随机序列的质量与您有关,您也可以使用java.security.SecureRandom,它具有更好的加密行为.(参见,例如,这个主题.)


Jos*_*lls 5

如果您希望在运行之间随机序列相同,则可以指定种子.通常您不希望这种情况发生,因此您为每次运行使用不同的种子,System.currentTimeMillis()是常用的合理种子.如果您正面临多线程,多线程将同时初始化RNG,您可能希望避免使用System.currentTimeMillis()并让Java使用自己的初始化.

  • 通常,您*总是*希望让Java使用自己的初始化.它比System.currentTimeMillis()更好,那你为什么要降级呢? (3认同)