gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:22:34 25 4
gpt4 key购买 nike

我使用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() 只是调用 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/61266190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com