提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 指定随机种子出现的问题?
- 总结
前言
业务中,之前有一个抽奖的需求,之初想让固定的奖品和玩家绑定一个固定的池子,也就是每个用户对应抽奖的池子的随机种子是固定的!但是这样就会遇到一个巨大的坑!
在指定Random随机种子的时候一定要谨慎!
指定随机种子出现的问题?
在计算机编程中,随机数生成算法实际上是通过确定性的计算来产生伪随机数序列。当你在使用随机数生成器时,你可以选择设置一个种子(seed),这个种子作为生成随机数的起始点。
当你指定一个特定的种子时,随机数生成器将使用该种子作为起点,并按照确定性的计算规则生成一个伪随机数序列。这意味着,只要你使用相同的种子,每次运行生成的随机数序列将是相同的。
在Java中,java.util.Random类的nextInt()方法使用当前时间作为默认的种子,以确保每次程序运行时生成不同的随机数序列。但是,如果你在创建Random对象时指定了一个特定的种子,那么每次运行生成的随机数序列将是相同的,这对于调试和测试来说是很有用的。
以下是一个示例代码,展示了如何使用指定的种子生成相同的随机数序列:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
long seed = 1234; // 指定种子
Random random = new Random(seed);
for (int i = 0; i < 5; i++) {
int randomNumber = random.nextInt();
System.out.println(randomNumber);
}
}
}
我们先运行一下看看输出
-1517918040
1115789266
-208917030
1019800440
-611652875
然后我们再次运行N次 结果都是一样的
在上面的代码中,我们指定了种子为1234,并使用该种子创建了一个Random对象。每次运行程序时,生成的随机数序列都将是相同的。如果你想要每次运行生成不同的随机数序列,请不要指定种子,或者使用不同的种子值。
需要注意的是,虽然这种方法可以生成相同的随机数序列,但它实际上是伪随机数序列,因为它们是通过算法计算得出的,并不是真正的随机数。
总结
指定随机种子虽然可以生成相同的随机数序列,是有规律可循的,是可以通过算法算出来的,并不是真正的随机!非必要情况!不要指定随机种子!