Java⽣成的随机数靠谱吗?多少次会重复?
⽬录
⼀、前⾔
⼆、利⽤Math.random()⽣成六位随机数测试
三、利⽤new Random().nextInt(999999)⽣成随机数
四、利⽤ThreadLocalRandom.current().nextInt(100000,999999)⽣成随机数
五、在2的基础上做了新的随机
⼀、前⾔
本⽂基于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 (ains(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 (ains(i)){
a++;
sum+=count;
count=0L;
list.clear();
if (a>=1000){
System.out.println("平均:"+(double)sum/a);
break;
}
}else{java valueof
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 (ains(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 (ains(i)){
a++;
sum+=count;
count=0L;
list.clear();
if (a>=1000){
System.out.println("平均:"+(double)sum/a);
break;
}
}else{
list.add(i);
}
}
运⾏结果
依然也是⼀千多次就会重复
由此暂时得出结论,以上的三(四)种⽣成随机数⽅法并不能达到万次不重复,⼤概在⼀千多次时就会出现重复的问题.
期待⼀个⽣成不重复六位随机数的⽅法
到此这篇关于Java⽣成的随机数靠谱吗?会重复吗?的⽂章就介绍到这了,更多相关Java随机数内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论