java - math.random() 遵循哪些算法

标签 java random

我正在使用 math.random() 方法生成随机数。但我对这种方法有疑问。 math.random() 是用来生成随机数的算法。有没有其他的随机数生成算法?

我正在尝试这段代码,但我认为生成随机代码效率不高:

for (int i = 0; i < N; i++) {
     int sd = i + (int) (Math.random() * (N-i));

     String t = one[r];
     one[r] = one[i];
     one[i] = t;
 }

有没有更好的随机数生成算法?

最佳答案

Java 主要根据您的用例提供四种随机数生成器 API。

java.lang.Math.random()

如果我们检查 Math class source code ,我们可以这样看:

private static Random randomNumberGenerator;

private static synchronized void initRNG() {
    if (randomNumberGenerator == null)
        randomNumberGenerator = new Random();
}

public static double random() {
    if (randomNumberGenerator == null) initRNG();
    return randomNumberGenerator.nextDouble();
}

Math.random() 只是调用随机类的快捷方式。它比 java.util.Random 更简单也更不完整,但在某些情况下已经足够了。

java.util.Random

Random 类实现了一个 Linear Congruential Generator .

LCG 是一个非常简单的伪随机数生成公式。 java.util.Random 不是真正随机的,它是完全确定的。使用相同的初始条件(也称为种子),您会以相同的顺序获得相同的结果。

使用 java.util.Random 适用于大多数用例(模拟、游戏等),但由于其可预测性,不适用于密码学,对于这种用例,请选择 java.security.SecureRandom

java.util.Random 是线程安全的,但在多线程上下文中可能会出现性能问题。如果您在多线程应用程序中工作,则更喜欢 ThreadLocalRandom

java.security.SecureRandom

SecureRandom 类扩展 java.util.Random 类以实现基于熵源的加密强随机数生成器。 SecureRandom 不是确定性的。

SecureRandom 在您的平台功能中有多个实现 (the complete implementation list)。

java.security.SecureRandom 由于熵源的原因不如 java.util.Random 快。

java.util.concurrent.ThreadLocalRandom

ThreadLocalRandom 类是 Linear Congruential Generator 的另一个实现。但是这个不是线程安全的,而是专用于特定线程。

This implementation is more fast than java.util.Random in multi-threaded context.


在您的情况下,您可以使用 java.util.Collections.shuffle(list) 通过 java.util.Random 或特定的随机生成器对数组进行洗牌像 java.security.SecureRandom

关于java - math.random() 遵循哪些算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22628408/

相关文章:

Java - JRadioButton 名称的 Action 监听器

java - 在调试期间检查或可视化使用 sqlite jdbc 创建的内存数据库

c++ - 当我可以将 RNG 传递给分布时,为什么要使用 variate_generator? (特别是 C++ 和 Boost)

c - 在 C 中的一行中用随机字节填充多维数组

java - Hibernate 在执行 native 查询时要快得多

java - 如何获取 Activity 的 View ?

java - 关于抽象类的两个概念让我困惑

hash - 加密哈希算法可以用作 PRNG 吗?

python - 如何使用 numpy 种子创建确定性随机数生成器?

java - 需要使用随机数和模数的帮助