Random隨機數詳解(抽獎概率的原理)

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

硬幣正反面也是同理,這裏面隨機數的區間以及中獎的概率都可以根據實際需要來做調整!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章