Java主要根据您的使用情况提供四个随机数生成器API.
java.lang.Math.random()
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 Class的快捷方式.它比java.util.Random更简单,更不完整,但在某些情况下它已经足够了.
java.util.Random中
LCG是伪随机数生成的一个非常简单的公式. java.util.Random不是随机的,它是完全确定的.使用相同的初始条件(也称为种子),您可以按相同的顺序获得相同的结果.
使用java.util.Random适用于大多数用例(模拟,游戏……)但由于其可预测性而不适用于加密,因为这种用例更喜欢java.security.SecureRandom.
java.util.Random是线程安全的,但在多线程上下文中可能存在性能问题.如果您在多线程应用程序中工作,则更喜欢ThreadLocalRandom.
java.security.SecureRandom中
SecureRandom类扩展java.util.Random类,以基于熵源实现加密强随机数生成器. SecureRandom不具有确定性.
由于熵源,java.security.SecureRandom的速度比java.util.Random快.
java.util.concurrent.ThreadLocalRandom
ThreadLocalRandom类是Linear Congruential Generator的另一个实现,但是这个实现不是线程安全的,而是专用于特定线程.
在您的情况下,您可以使用java.util.Collections.shuffle(list)来使用java.util.Random或特定的随机生成器(如java.security.SecureRandom)对您的数组进行混洗.