我正在使用 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/