首页 > 编程知识 正文

java生成随机数,java随机数生成1到10

时间:2023-05-06 00:10:00 阅读:258335 作者:1514

本文基于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); } }

运行结果

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

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

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

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。