1、使用单独的方法生成随机数代码
根据给定的 BigInteger
随机索引生成一个排列(Permutation),并且通过阶乘的除法和余数来逐步构造最终的排列。
import java.math.BigInteger;
import java.util.Arrays;
public class Main {
public static int[] shuffle(int n, BigInteger random_index) {
int[] perm = new int[n];
BigInteger[] fact = new BigInteger[n];
fact[0] = BigInteger.ONE;
// 计算阶乘
for (int k = 1; k < n; ++k) {
fact[k] = fact[k - 1].multiply(BigInteger.valueOf(k));
}
// 根据 random_index 和阶乘数组生成排列
for (int k = 0; k < n; ++k) {
BigInteger[] divmod = random_index.divideAndRemainder(fact[n - 1 - k]);
perm[k] = divmod[0].intValue();
random_index = divmod[1];
}
// 重新调整排列值,确保排列顺序正确
for (int k = n - 1; k > 0; --k) {
for (int j = k - 1; j >= 0; --j) {
if (perm[j] <= perm[k]) {
perm[k]++;
}
}
}
return perm;
}
public static void main(String[] args) {
System.out.printf("%s\n", Arrays.toString(
shuffle(50, new BigInteger(
"7890123456789012345678901234567890123456789012345678901234567890"))));
}
}
2、使用SecureRandom生成随机数
SecureRandom
是用于生成安全的随机数,通常用于密码学应用,它比 Random
更加复杂和安全。
import java.security.SecureRandom;
public class Main {
public static void main(String[] args) {
SecureRandom secureRandom = new SecureRandom();
// 生成一个 [0, 100) 之间的随机整数
int randomInt = secureRandom.nextInt(100);
System.out.println("Random integer [0, 100) using SecureRandom: " + randomInt);
// 生成一个 [0.0, 1.0) 之间的随机浮动数
double randomDouble = secureRandom.nextDouble();
System.out.println("Random double [0.0, 1.0) using SecureRandom: " + randomDouble);
}
}
3、使用 ThreadLocalRandom
ThreadLocalRandom
是在多线程环境中生成随机数的推荐方法,能够避免 Random
对象的竞争。它通过线程局部变量来提供性能上的优势。
import java.util.concurrent.ThreadLocalRandom;
public class Main {
public static void main(String[] args) {
// 生成一个 [0, 100) 之间的随机整数
int randomInt = ThreadLocalRandom.current().nextInt(100);
System.out.println("Random integer [0, 100) using ThreadLocalRandom: " + randomInt);
// 生成一个 [0.0, 1.0) 之间的随机浮动数
double randomDouble = ThreadLocalRandom.current().nextDouble();
System.out.println("Random double [0.0, 1.0) using ThreadLocalRandom: " + randomDouble);
}
}