按概率生成隨機結果,自己控制字元結果的生成類似彩票系統

煙花散盡13141發表於2019-08-13

隨機數是專門的隨機實驗的結果,在統計學的不同技術中需要使用隨機數,比如在從統計總體中抽取有代表性的樣本的時候,或者在將實驗動物分配到不同的實驗組的過程中,或許在進行蒙特卡羅模擬法計算的時候等等。產生隨機數有多種不同的方法,這些方法被稱為隨機數發生器。隨機數量重要的特性是:他所產生的後面的那個數與前面的那個數毫無聯絡。

今天我們討論的問題就是基於隨機數展開的。總所周知,彩票就是一種隨機的發生,但是在這隨機的表面下實際上是一種有目的行的控制的隨機。簡而言之是在大概率下的隨機生成

定義概率集
改造概率集
隨機生成概率集索引
通過率索查詢元素
測試資料驗證
加入戰隊

目錄

定義概率集


/**
 * 定義一個連續集合
 * 集合中元素x滿足:(minElement,maxElement]
 * 數學表示式為:minElement < x <= maxElement
 *
 */
public class ContinuousList {

    private double minElement;
    private double maxElement;

    public ContinuousList(double minElement, double maxElement){
        if(minElement > maxElement){
            throw new IllegalArgumentException("區間不合理,minElement不能大於maxElement!");
        }
        this.minElement = minElement;
        this.maxElement = maxElement;
    }

    /**
     * 判斷當前集合是否包含特定元素
     * @param element
     * @return
     */
    public boolean isContainKey(double element){
        boolean flag = false;
        if(element > minElement && element <= maxElement){
            flag = true;
        }
        return flag;
    }

}

首先通過一個類ContinuousList來儲存概率集的物件,用來表示在宿主軸1上。這裡友情提醒一下,這裡的概率集並不一定需要概率和為100% , 這裡的概率提供方只需要提供一個權重就行了,我們在投射到宿主軸2上的時候自動會一次補全的,最後也是通過隨機數看在那塊權重對應的索引上的。就好想將權重類似鋪磚一樣依次鋪滿就行,然後隨機扔一個石子看在那一塊就行。

構造概率因子

概率平鋪示意圖

示意圖

改造概率集

上面我們提到供應方提供的是權重,圖一提供{10,10,5,5,30,10,5,25},總和為100(不是必須是100,這裡100只是為了方便觀測)這些表示的意思是生成第0位的該路為10/100=10%。現在加入我們有一個陣列集合為{“a”,"b","c","d","e","f","g","h"}這八個字元。那麼現在通過圖一的構造,那麼生成a~h的概率分別是{10%,10%,5%,5%,30%,10%,5%,25%}
那麼如何通過權重轉變為概率的呢。

  • 首先第一個元素權重為10,則其在宿主軸3上的分佈範圍為 0~10
  • 第二個元素權重10,對應的分佈範圍則為10~20
  • 第三個元素權重5,對應的分佈範圍則為20~25
  • 第四個元素權重5,對應的分佈範圍則為25~30
  • 第五個元素權重30,對應的分佈範圍則為30~60
  • 第六個元素權重10,對應的分佈範圍則為60~70
  • 第七個元素權重5,對應的分佈範圍則為70~75
  • 第八個元素權重25,對應的分佈範文責問75~100

分佈圖

隨機生成概率集索引


/**
 * 進行抽獎操作
 * 返回:獎品的概率list集合中的下標
 */
public int randomColunmIndex(){
    int index = -1;
    Random r = new Random();
    double d = r.nextDouble() * maxElement;  //生成0-1間的隨機數
    if(d == 0d){
        d = r.nextDouble() * maxElement;     //防止生成0.0
    }
    int size = lotteryList.size();
    for(int i = 0; i < size; i++){
        ContinuousList cl = lotteryList.get(i);
        if(cl.isContainKey(d)){
            index = i;
            break;
        }
    }
    if(index == -1){
        throw new IllegalArgumentException("概率集合設定不合理!");
    }
    return index;

}

現在我們的宿主軸4已經構建好了,下面我們基於各個讀者使用的語言生成0~1的隨機數,然後按宿主軸5的比例放大至宿主軸6上。
例如: 隨機生成0.5238 , 上述的宿主軸7長度是100 , 則此次生成的隨機數0.5238對應宿主軸8上的52.38。52.38在30~60這個區間範圍,所以此次隨機生成的所以則為30~60對應的索引3(從0開始)

通過率索查詢元素

上面52.38對應的概率集合中的索引是3,這裡就解釋了為什麼概率集和結果集個數要對應上。因為通過宿主軸9我們生成了索引,概率集和結果集個數一樣就保證了我們一定會獲取到結果。通過索引3我們獲取到的結果是d

測試資料驗證

上面介紹了改演算法的執行原理集流程,紙上得來終覺淺,現在我們將通過該演算法隨機生成100000條資料,生成的同時我們加上統計數量的演算法。最後我們對比下計劃生成的概率和實際生成概率就可以驗證改演算法了。

結果

到這裡也該和讀者說再見了,今天的按概率生成隨機數就結束了,如果讀者對隨機數生成原理感興趣的話,可以對次軟文擁有者建議,後續我會根據情況進行原理分析的。

加入戰隊

原始碼提供

個人網站

[個人微信] zxh870775401

微信公眾號

微信公眾號


  1. 宿主軸是將概率的整體分佈抽象為一條射線,不同的概率投影在該條射線上。

  2. 宿主軸是將概率的整體分佈抽象為一條射線,不同的概率投影在該條射線上。

  3. 宿主軸是將概率的整體分佈抽象為一條射線,不同的概率投影在該條射線上。

  4. 宿主軸是將概率的整體分佈抽象為一條射線,不同的概率投影在該條射線上。

  5. 宿主軸是將概率的整體分佈抽象為一條射線,不同的概率投影在該條射線上。

  6. 宿主軸是將概率的整體分佈抽象為一條射線,不同的概率投影在該條射線上。

  7. 宿主軸是將概率的整體分佈抽象為一條射線,不同的概率投影在該條射線上。

  8. 宿主軸是將概率的整體分佈抽象為一條射線,不同的概率投影在該條射線上。

  9. 宿主軸是將概率的整體分佈抽象為一條射線,不同的概率投影在該條射線上。

相關文章