java - 使用具有当前时间的随机数生成器与不使用

标签 java random

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

Random rand = new Random(System.currentTimeMillis());

还有这个:

Random rand = new Random();

我知道这些数字是伪随机的,但我还没有完全理解细节,以及它们是如何产生的,介于将当前时间用作种子时获得的“随机性”级别与默认时间之间使用构造函数。

最佳答案

提供您自己的种子对于您有意多次生成相同的伪随机值序列的模拟非常有用。不过,一般来说,使用默认构造函数也一样。

当使用默认构造函数时,the docs说:

This constructor sets the seed of the random number generator to a value very likely to be distinct from any other invocation of this constructor.

换句话说,它在内部生成自己的种子。详细信息取决于所使用的特定 Java 实现。我见过的一个实现是这样的:

private static volatile long seedBase = 0;

public Random() {
    setSeed(System.nanoTime() + seedBase);
    ++seedBase;
}

随机性的实际质量不会改变。如果你关心随机序列的质量,你也可以使用 java.security.SecureRandom ,具有更好的加密行为。 (参见,例如,this thread。)

关于java - 使用具有当前时间的随机数生成器与不使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32277110/

相关文章:

java - 检测数字是否为 7 的倍数或包含数字 7

java - 有没有办法获取在 Spring 应用程序/容器中配置为 bean 的所有 javax.sql.DataSource 的集合?

java - 读取 JSON 响应

ios - Swift:如何每秒随机更改背景颜色?

c - 程序打印的坐标与我为其生成的坐标不同

python - Python中的概率分布

java - Android 上的 JNI : How to retrieve a string from Java code?

java - 概括 REST API 的分页技术

c++ - C++中如何改变数组的顺序

c++ - std::random_device的实现方式