Java中常用的三种产生随机数的方法及其原理详解(currentTimeMills,random,Math.random)
这学期笔者开始学习Java,由于以前有了C做基础,学Java明显可以轻松许多,但是这几天有个问题很苦恼,有几道题目要产生随机数,我百度了一下,发现了多种使用的方法,但大多知识是零星的。于是今天我打算给大家分享一下我总结了的三种在Java里面很常用的方法。如果有任何不恰当的地方,欢迎大家在评论区不吝指出或者是私信我,我会尽力改正,给大家呈现更优质的内容。 |
一.使用currentTimeMills
currentTimeMills返回的是从1970年一月一日零时零分零秒到现在总共的毫秒数,我们可以用这个毫秒数来产生随机数。如何产生呢?
如果要是产生[0,n-1]范围内的随机数,可以这样写:
int randomNum1 = (int)(System.currentTimeMillis()%10);
//用当前时间获得[0,9]之间的随机数
这个函数就能够产生[0,9]范围内的随机数啦!
那我们要是想产生多个随机数怎么办,有的小伙伴可能会想,我写两个不就好了,那我们看看写两个到底行不行:
int randomNum1 = (int)System.currentTimeMillis()%10;
//用当前时间获得[0,9]之间的随机数
int randomNum2 = (int)System.currentTimeMillis()%10;
System.out.println("用当前时间获得的随机数:"+randomNum1+" "+randomNum2);
//输出第一次:用当前时间获得的随机数:-1 -1
//输出第二次:用当前时间获得的随机数:-1 -1
//输出第三次:用当前时间获得的随机数:-9 -9
我把程序运行了三次,但是奇怪的是,程序并没有按照我们所想的那样输出,这是为什么呢?细心地小伙伴可能发现了,上面第一个代码块和第二个代码块有一点细微的差别,第一个代码块System.currentTimeMillis()%10整体打上了括号,而第二个没有,出现这个问题的原因我细细说来。
最最重要的一点,我们把随机数定义成了int型,而System.currentTimeMillis返回的是一个long型的毫秒数,所以我用了强制类型转换(int)要知道,强制类型转换()可是优先级很高的,*,%的优先级都比它低,所以如果不打括号,系统就会把一个long型的值强制转换为int型,因为这个long型的数据的值太大了,以至于超过了int的范围,这个过程中当然会出错了,口说无凭,上代码:
int randomNum1 = (int)(System.currentTimeMillis()%10);
//用当前时间获得[0,9]之间的随机数
int randomNum2 = (int)System.currentTimeMillis()%10;
long randomNum3 = System.currentTimeMillis();
int randomNum4 = (int)System.currentTimeMillis();
System.out.println("打括号:"+randomNum1+"\n不打括号"
+randomNum2+