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

网友投稿 569 2022-10-20


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

一、前言

本文基于JDK1.8

最近在项目中碰到一个做订单号的需求,甲方的意思是以字母开头,后边跟年份和6位流水号.

我第一反应就是流水号用随机数生成,突然就想到一个问题,java的随机数真的靠谱吗?六位数大概是十万级别,Java可以保证一万次不重复吗?带着疑问,我通过三种生成随机数的方式做了三个测试.

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

List 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 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;

}

aJEBZ 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 list=new ArrayList<>();

//记录计算次数

Long count=0L;

//记录循环次数

double a=0.0;

//记录多次计算的总值

Long sum=0L;

while (true){

count++;

Integer i = Thrhttp://eadLocalRandom.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 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);

}

}

运行结果

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

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

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Sun副总裁:绿色数据中心需分四步走
下一篇:IB客座主编(一)--安普布线亚太区业务总监黎启枝
相关文章

 发表评论

暂时没有评论,来抢沙发吧~