Java生成的随机数靠谱吗?多少次会重复?
短信预约 -IT技能 免费直播动态提醒
一、前言
本文基于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随机数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341