Java生成随机数大概多少次会出现重复?(JDK1.8)

本文探讨了Java中三种生成随机数的方法——Math.random(), new Random().nextInt()以及ThreadLocalRandom.current().nextInt()——在生成六位不重复随机数时的表现。通过测试发现,这些方法在大约1100到1300次之间就会出现重复,无法确保一万次不重复。作者寻求更可靠的生成不重复六位随机数的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文基于JDK1.8
最近在项目中碰到一个做订单号的需求,甲方的意思是以字母开头,后边跟年份和6位流水号.
我第一反应就是流水号用随机数生成,突然就想到一个问题,Java的随机数真的靠谱吗?六位数大概是十万级别,Java可以保证一万次不重复吗?带着疑问,我通过三种生成随机数的方式做了三个测试.

1.利用Math.random()生成六位随机数测试

        List<Integer> list=new ArrayList<>();
        //记录计算次数
        Long count=0L;
        //记录循环次数
        double a=0.0;
        //记录多次计算的总值
        Long sum=0L;
        while (true){
            count++;
            Integer i = (int)((Math.random()*9+1)*100000);
            System.out.println("第"+count+"次,i为:"+i);
            if (list.contains(i)){
              a++;
              sum+=count;
              count=0L;
              list.clear();
              if (a>=1000){
                  System.out.println("平均:"+(double)sum/a);
                  break;
              }
            }else{
                list.add(i);
            }
        }

运行结果如下:
在这里插入图片描述
多次运行结果大概就是在取1100~1300次之间会出现重复.

2.利用new Random().nextInt(999999)生成随机数

        List<Integer> list=new ArrayList<>();
        //记录计算次数
        Long count=0L;
        //记录循环次数
        double a=0.0;
        //记录多次计算的总值
        Long sum=0L;
        while (true){
            count++;
            Integer i = new Random().nextInt(999999);
            while (i<100000){
                i=i*10;
            }
            System.out.println("第"+count+"次,i为:"+i);
            if (list.contains(i)){
              a++;
              sum+=count;
              count=0L;
              list.clear();
              if (a>=1000){
                  System.out.println("平均:"+(double)sum/a);
                  break;
              }
            }else{
                list.add(i);
            }
        }

运行结果:
在这里插入图片描述
多次运行结果大概也是1100~1300次之间重复

3.利用ThreadLocalRandom.current().nextInt(100000,999999)生成随机数(该方法也是hutool工具RandomUtil.random()的底层实现)

    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        //记录计算次数
        Long count=0L;
        //记录循环次数
        double a=0.0;
        //记录多次计算的总值
        Long sum=0L;
        while (true){
            count++;
            Integer i = ThreadLocalRandom.current().nextInt(100000,999999);
            System.out.println("第"+count+"次,i为:"+i);
            if (list.contains(i)){
              a++;
              sum+=count;
              count=0L;
              list.clear();
              if (a>=1000){
                  System.out.println("平均:"+(double)sum/a);
                  break;
              }
            }else{
                list.add(i);
            }
        }
    }

运行结果:
在这里插入图片描述
平均次数也是1100~1300次之间重复,

4.在2的基础上做了新的随机

        List<Integer> list=new ArrayList<>();
        //记录计算次数
        Long count=0L;
        //记录循环次数
        double a=0.0;
        //记录多次计算的总值
        Long sum=0L;
        while (true){
            count++;
            Integer i = new Random().nextInt(999999);
            while (i<100000){
                i=Integer.parseInt(String.valueOf(i)+String.valueOf(new Random().nextInt(10)));
            }
            System.out.println("第"+count+"次,i为:"+i);
            if (list.contains(i)){
              a++;
              sum+=count;
              count=0L;
              list.clear();
              if (a>=1000){
                  System.out.println("平均:"+(double)sum/a);
                  break;
              }
            }else{
                list.add(i);
            }
        }

运行结果
在这里插入图片描述
依然也是一千多次就会重复

由此暂时得出结论,以上的三(四)种生成随机数方法并不能达到万次不重复,大概在一千多次时就会出现重复的问题.

期待一个生成不重复六位随机数的方法

如果文章有错误的地方,还请您不吝赐教!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值