java.util.Random是Java中一個可以生成隨機數的類,並且你可以通過傳入相關參數來對隨機數的範圍進行控制,無論在實際開發中,還是學習生活中,Random隨機數都能起到比較大的作用。那麼今天就來學習一下Random的使用!
相信你肯定抽過獎!那麼作爲一個程序員,你有沒有想過那些抽獎的大轉盤,或者是九宮格是怎麼實現的呢?又是怎麼控制中獎概率的呢?跟着我的腳步,我帶你領略Random的風騷!
實例化對象
通過源碼可以看到Random類是有兩個構造方法的,其中一種是不帶參的,還有一種是帶有一個long類型參數(稱爲:種子)的,那麼這兩種有何區別呢?
不帶參:完全隨機
帶參:傳入參數(種子)的Random對象所生成的隨機數是固定的
舉個栗子,當你實例化兩個Random對象時,如果參數(種子)都傳入10,那麼這兩個Random(random1 和 random2)對象所生成的隨機數,random1生成的第一個隨機數 = random2生成的第一個隨機數 ,random1生成的第二個隨機數 = random2生成的第二個隨機數 ,代碼如下:
//實例化Random對象
Random random = new Random();
Random random2 = new Random();
Random random3 = new Random(10);
Random random4 = new Random(10);
for (int i = 0; i < 10; i++) {
int number=random.nextInt();
int number2=random2.nextInt();
int number3=random3.nextInt();
int number4=random4.nextInt();
//輸出格式是: 無種子隨機數 無種子隨機數 有種子隨機數 有種子隨機數
System.out.println(number+"_"+number2+"___"+number3+"_"+number4);
}
輸出結果:
1075217332 -2135067742 -1157793070 -1157793070
-944171219 -837885942 1913984760 1913984760
1314450533 1413088185 1107254586 1107254586
215653709 -337612687 1773446580 1773446580
1737734575 1766714434 254270492 254270492
從輸出的五組數來看,可以明顯地發現,無種子隨機數生成的隨機數是完全隨機的(沒有任何聯繫),而傳入了種子的兩個random對象所生成的隨機數是一樣的,得出結論:傳入種子的Random對象所生成的隨機數是固定的
注意:種子不會影響隨機數的範圍
常用方法
Random的幾個常用方法都比較簡單,這裏只列舉三種最常用的。
生成 int 類型隨機數
這裏演示獲取多種類型的 int 數據的方法:默認範圍 [int最小值,int最大值) 、0~最大範圍 [0,max) 、自定義範圍 [min , max) 、自定義範圍 [min , max] ,當然了這裏只演示幾種最常用的,還有很多其他類型的,都可以通過不同的公示來進行改變
//生成默認範圍(int類型的範圍)的隨機數
int i = random.nextInt();//[int最小值,int最大值)
//生成自定義 0~最大範圍(max)的正整數隨機數 [0,max)
int i = random.nextInt(max);//[0,10)
//生成自定義範圍隨機數 [min , max)
//公式: .nextInt(max) % (max - min) + min
int i=random.nextInt(10)%(10-5)+5;//[5,10)
//生成自定義範圍隨機數 [min , max]
//公式: .nextInt(max) % (max - min + 1) + min
int i = random.nextInt(10) % (10 - 5 + 1) + 5;//[5,10]
生成 boolean 類型隨機數
這個很好理解,就是直接生成 true 和 false 中的一個,概率相同
boolean b = random.nextBoolean();
生成 double 類型隨機數
nextDouble()生成的隨機數範圍是 [0 , 1.0) 的小數
double d = random.nextDouble();
隨機數的幾種常用用途
隨機數在很多地方都用得到,我個人最常見的就是應用在抽獎中了,一個抽獎程序,想要控制各種獎項的概率,用隨機數來做再合適不過了!
中獎概率的控制:
中獎概率控制原理:通過獲取隨機數,然後利用 if 語句先限定中獎的區間,就可以達到一個公平的概率效果!
//首先在 [1,100] 區間(100個數)隨機獲取一個數
int i = random.nextInt(100) % (100 - 1 + 1) + 1;
System.out.println("當前獲取的隨機數:" + i);
//然後根據中間概率來設置 if 條件語句的區間,達到效果
if (i >= 80) {// [80,100] 一等獎
System.out.println("恭喜,一等獎!");
} else if (i >= 50) { // [50,80] 二等獎
System.out.println("恭喜,二等獎!");
} else {//[1,50] 謝謝惠顧
System.out.println("很遺憾,沒有中獎!");
}
骰子的製作:
//首先在 [1,6] 區間(6個數)隨機獲取一個數
int i = random.nextInt(6) % (6 - 1 + 1) + 1;
System.out.println("骰子點數:" + i);
硬幣正反面也是同理,這裏面隨機數的區間以及中獎的概率都可以根據實際需要來做調整!