Java随机函数
Java有三種獲取隨機數(shù)的方法
一. java.util.Random包下的Random類,通過new一個Random對象來產(chǎn)生隨機數(shù)。
二. Math.random()方法,產(chǎn)生的隨機數(shù)是[0,1)之間的一個double數(shù)。
三.?System.currentTimeMillis(),該方法返回從1970年1月1號0點0分0秒到現(xiàn)在的毫秒數(shù),返回值為long。
Random類
Random類有兩種構(gòu)造方法:帶種子和不帶種子。
不帶種子:
每次運行結(jié)果不一樣。默認(rèn)種子為System.currentTimeMillis(),即系統(tǒng)時間作為seed。因為時間一直在改變所以種子也在變。
Random() rdm = new Random();?
//Random() rdm = new Random(System.currentTimeMillis());
帶種子:
每次運行結(jié)果都一樣。相同種子的運行結(jié)果一樣。
Random rdm = new Random(100);
Random類中的8種方法
rdm.nextInt() //返回int取值范圍內(nèi)的偽隨機數(shù),[2147483648 , 2147483647]
rdm.nextInt(n) //返回0~n的偽隨機數(shù),[0 , n)
rdm.nextLong()//返回long取值范圍內(nèi)的偽隨機數(shù),[-(2^63-1) , 2^63]
rdm.nextDouble() //返回double類型的偽隨機數(shù),[0.0 , 1.0)
rdm.nextFloat() //返回float類型的偽隨機數(shù),[0.0 , 1.0)
rdm.nextBytes(bytes)//用隨機數(shù)填充指定字節(jié)數(shù)組的元素
rdm.nextBoolean()//返回true或false
rdm.nextGaussian()//返回高斯/正態(tài)分布
接下來對以上方法進行測試
import java.util.Random;public class TestRandom2 {public static void main(String[] args) {Random rdm1 = new Random();//不帶種子Random rdm2 = new Random(100);//帶種子Random rdm3 = new Random(100);//與rdm2帶一樣的種子byte[] data = new byte[3];//用隨機數(shù)填充data數(shù)組rdm1.nextBytes(data);for(int i=0;i<3;i++){System.out.println("不帶種子的nextInt(): "+rdm1.nextInt());}System.out.println();for(int i=0;i<3;i++){System.out.println("不帶種子的nextInt(10): "+rdm1.nextInt(10)+",");}System.out.println();for(int i=0;i<3;i++){System.out.println("rdm2帶種子數(shù)100: "+rdm2.nextInt(10));}System.out.println();for(int i=0;i<3;i++){System.out.println("rdm3帶種子數(shù)100: "+rdm3.nextInt(10));}System.out.println();System.out.println("nextLong(): "+rdm1.nextLong());System.out.println("nextDouble(): "+rdm1.nextDouble());System.out.println("nextFloat(): "+rdm1.nextFloat());System.out.println("nextGaussian(): "+rdm1.nextGaussian());System.out.println("nextBoolean(): "+rdm1.nextBoolean());System.out.print("nextBytes(bytes): ");for(int i=0;i<3;i++){System.out.print(data[i]+" ");}} }
第二次運行結(jié)果
可以看出帶種子的構(gòu)造方法,兩次運行結(jié)果是一樣的。種子數(shù)相同運行結(jié)果也是一樣的。
不帶種子的兩次運行結(jié)果則不同。
Math.random()
產(chǎn)生[0,1)之間的double類型隨機數(shù)Math.random()*n>>>[0,n)之間的隨機數(shù) (int)(Math.random()*n)>>>[0,n)之間的隨機整數(shù) ?//int后面的()不能缺,否則會先強制轉(zhuǎn)換Math.random()
Math.round(Math.random()*(MAX-MIN)+MIN)>>>[MIN,MAX]//Math.round()可以暫時理解為四舍五入函數(shù)
進行測試 double temp1;int temp2;long temp3;System.out.print("[0,1): ");for(int i=0;i<3;i++){temp1=Math.random();System.out.print(temp1+" ");}System.out.println();System.out.print("[0,9]: ");for(int i=0;i<3;i++){temp2=(int) (Math.random()*10);System.out.print(temp2+" ");}System.out.println();System.out.print("[0,10]: ");for(int i=0;i<3;i++){//Math.round 四舍五入函數(shù)(負(fù)數(shù)的話小數(shù)等于5時不進位,-1.5=-1)temp3=Math.round(Math.random()*9+1);System.out.print(temp3+" ");}
運行結(jié)果
System.currentTimeMillis()
返回當(dāng)前的系統(tǒng)時間,返回值為longtemp=System.currentTimeMillis()%100; //對系統(tǒng)時間取模,返回[0,99]之間的隨機整數(shù)
此方法有個很大的缺陷,當(dāng)兩次取值的時間間隔非常小時,取出的值是相同的。 因此我們需要在循環(huán)中加入sleep。
進行測試 long r1,r2;System.out.print("返回當(dāng)前毫秒數(shù): ");for(int i=0;i<3;i++){r1 = System.currentTimeMillis();System.out.print(r1+" ");}System.out.println();System.out.print("加入sleep(): ");for(int i=0;i<3;i++){r1=System.currentTimeMillis();System.out.print(r1+" ");try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println();//對系統(tǒng)時間進行模運算System.out.print("一百以內(nèi)隨機數(shù): ");for(int i=0;i<3;i++){r2=System.currentTimeMillis()%100;System.out.print(r2+" ");}System.out.println();//sleep后的模運算System.out.print("加入sleep(): ");for(int i=0;i<3;i++){r2=System.currentTimeMillis()%100;System.out.print(r2+" ");try {Thread.sleep(70);} catch (InterruptedException e) {e.printStackTrace();}}
運行結(jié)果
總結(jié)
- 上一篇: 灵性图书馆:好书推荐-《当下的力量》
- 下一篇: 2016小米-风口的猪-中国牛市-Jav