Java生成的随机数靠谱吗?多少次会重复?

 更新时间:2021年06月10日 14:28:41   作者:LwinnerG  
今天给大家带来的是关于Java的相关知识,文章围绕着Java生成的随机数靠不靠谱展开,文中有非常详细的介绍,需要的朋友可以参考下

一、前言

本文基于JDK1.8

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

二、利用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次之间会出现重复.

三、利用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次之间重复

四、利用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次之间重复,

五、在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);
            }
        }

运行结果

在这里插入图片描述

依然也是一千多次就会重复

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

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

到此这篇关于Java生成的随机数靠谱吗?会重复吗?的文章就介绍到这了,更多相关Java随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一个通用的Java分页基类代码详解

    一个通用的Java分页基类代码详解

    这篇文章主要介绍了一个通用的Java分页基类代码详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Springboot自定义注解&传参&简单应用方式

    Springboot自定义注解&传参&简单应用方式

    SpringBoot框架中,通过自定义注解结合AOP可以实现功能如日志记录与耗时统计,首先创建LogController和TimeConsuming注解,并为LogController定义参数,然后,在目标方法上应用这些注解,最后,使用AspectJ的AOP功能,通过切点表达式定位这些注解
    2024-10-10
  • 老生常谈反射之Class类的使用(必看篇)

    老生常谈反射之Class类的使用(必看篇)

    下面小编就为大家带一篇老生常谈反射之Class类的使用(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java自定义类加载器实现类隔离详解

    Java自定义类加载器实现类隔离详解

    由于每种组件的不同版本所依赖的jar包不同,我们可以借鉴tomcat的实现方式,通过自定义类加载器打破双亲委派机制来实现类隔离,从而达到操作多组件多版本的目的。本文就来和大家详细聊聊实现方法
    2023-03-03
  • java实现相同属性名称及相似类型的pojo、dto、vo等互转操作

    java实现相同属性名称及相似类型的pojo、dto、vo等互转操作

    这篇文章主要介绍了java实现相同属性名称及相似类型的pojo、dto、vo等互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • MyBatis的MapKey注解实例解析

    MyBatis的MapKey注解实例解析

    这篇文章主要为大家介绍了MyBatis的MapKey注解实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java Character类的详解

    Java Character类的详解

    本篇文章主要详细介绍了JAVA中 Character类 方法等,需要的朋友可以参考下
    2017-04-04
  • Quarkus中的依赖注入DI和面向切面aop编程

    Quarkus中的依赖注入DI和面向切面aop编程

    这篇文章主要为大家介绍了Quarkus中的依赖注入DI和面向切面aop的编程规范思想,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • SpringBoot添加SSL证书的方法

    SpringBoot添加SSL证书的方法

    HTTPS 实际上就是 HTTP + SSL,使我们的网站更加安全,地址栏上会有一把小锁。那么如何在SpringBoot添加SSL证书,下面就一起来了解一下
    2021-05-05
  • SpringBoot、mybatis返回树结构的数据实现

    SpringBoot、mybatis返回树结构的数据实现

    本文主要介绍了SpringBoot、mybatis返回树结构的数据实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04

最新评论