Random指定随机种子遇到的坑

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

业务中,之前有一个抽奖的需求,之初想让固定的奖品和玩家绑定一个固定的池子,也就是每个用户对应抽奖的池子的随机种子是固定的!但是这样就会遇到一个巨大的坑!

在指定Random随机种子的时候一定要谨慎!

指定随机种子出现的问题?

在计算机编程中,随机数生成算法实际上是通过确定性的计算来产生伪随机数序列。当你在使用随机数生成器时,你可以选择设置一个种子(seed),这个种子作为生成随机数的起始点。

当你指定一个特定的种子时,随机数生成器将使用该种子作为起点,并按照确定性的计算规则生成一个伪随机数序列。这意味着,只要你使用相同的种子,每次运行生成的随机数序列将是相同的。

在Java中,java.util.Random类的nextInt()方法使用当前时间作为默认的种子,以确保每次程序运行时生成不同的随机数序列。但是,如果你在创建Random对象时指定了一个特定的种子,那么每次运行生成的随机数序列将是相同的,这对于调试和测试来说是很有用的。

以下是一个示例代码,展示了如何使用指定的种子生成相同的随机数序列:

java 复制代码
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);
        }
    }
}

我们先运行一下看看输出

java 复制代码
-1517918040
1115789266
-208917030
1019800440
-611652875

然后我们再次运行N次 结果都是一样的

在上面的代码中,我们指定了种子为1234,并使用该种子创建了一个Random对象。每次运行程序时,生成的随机数序列都将是相同的。如果你想要每次运行生成不同的随机数序列,请不要指定种子,或者使用不同的种子值。

需要注意的是,虽然这种方法可以生成相同的随机数序列,但它实际上是伪随机数序列,因为它们是通过算法计算得出的,并不是真正的随机数。

总结

指定随机种子虽然可以生成相同的随机数序列,是有规律可循的,是可以通过算法算出来的,并不是真正的随机!非必要情况!不要指定随机种子!

相关推荐
萧鼎10 天前
Python中的随机数生成与控制:random库实战解析
python·random·随机数
redwingz1 个月前
openssl签名报错
openssl·random
Bruce_Liuxiaowei2 个月前
使用 Python 模拟蒙特卡洛实验
开发语言·python·random
HopeTurbo3 个月前
【python】模块-标准库(sys,os,math,random)
python·random·os·math·sys
共饮一杯无4 个月前
Java给定一些元素随机从中选择一个
java·windows·random·随机数
谷哥的小弟4 个月前
Random随机数
软件开发·random·随机数·真随机·伪随机
Rcain_R6 个月前
JUC下的ThreadLocalRandom详解
java·后端·高并发·线程·juc·random·threadlocal
刘好念8 个月前
[C++] C++生成随机数
c++·stl·random
月空MoonSky10 个月前
代码评审——随机数Random问题
java·random·securerandom