僞隨機數的一些概念

【僞隨機數】算法

真正意義上的隨機數(或者隨機事件)在某次產生過程當中是按照實驗過程當中表現的分佈機率隨機產生的,其結果是不可預測的,是不可見的。
而計算機中的隨機函數是按照必定算法模擬產生的,其結果是肯定的,是可見的。咱們能夠這樣認爲這個可預見的結果其出現的機率是100%。因此用計算機隨機函數所產生的「隨機數」並不隨機,是僞隨機數。編程

【二項分佈】安全

若某事件機率爲p,每次試驗相互獨立,結果只有發生與不發生兩種(伯努利實驗),現重複試驗n次,則該事件發生k次的機率爲:P=C(k,n) * (p^k) * ((1-p)^(n-k))其中C(k,n)表示組合數,即從n個事物中拿出k個的方法數。函數

當n很大p很小時,能夠取np=λ則趨近於泊松分佈。this

【泊松分佈】線程

在實際事例中,當一個隨機事件,例如某電話交換臺收到的呼叫、來到某公共汽車站的乘客等等,以固定的平均瞬時速率λ(或稱密度)隨機且獨立地出現時,那麼這個事件在單位時間(面積或體積)內出現的次數或個數就近似地服從泊松分佈。
例子:已知某家小雜貨店,平均每週售出2個水果罐頭。請問該店水果罐頭的最佳庫存量是多少?假定不存在季節因素,能夠近似認爲,這個問題知足如下三個條件:(1)顧客購買水果罐頭是小几率事件。(2)購買水果罐頭的顧客是獨立的,不會互相影響。(3)顧客購買水果罐頭的機率是穩定的。在統計學上,只要某類事件知足上面三個條件,它就服從"泊松分佈"。
各個參數的含義:P(X=k)= (e^(-λ)) * (λ^k) / k!
P:每週銷售k個罐頭的機率。X:水果罐頭的銷售變量。k:X的取值(0,1,2,3...)。
λ:每週水果罐頭的平均銷售量,是一個常數,即速率爲2。事件

當λ很大時,則趨近於正態分佈。(正態分佈是連續的,但泊松分佈是離散的。)ip

【生成僞隨機數】get

通常地,僞隨機數的生成方法主要有如下3種:
(1) 直接法(Direct Method),根據分佈函數的物理意義生成。缺點是僅適用於某些具備特殊分佈的隨機數,如二項式分佈、泊松分佈。
(2) 逆轉法(Inversion Method),假設U服從[0,1]區間上的均勻分佈,令X=F-1(U),則X的累計分佈函數(CDF)爲F。該方法原理簡單、編程方便、適用性廣。
(3)接受拒絕法(Acceptance-Rejection Method):假設但願生成的隨機數的機率密度函數(PDF)爲f,則首先找到一個PDF爲g的隨機數發生器與常數c,使得僞隨機數發生器f(x)≤cg(x),而後根據接收拒絕算法求解。因爲算法平均運算c次才能獲得一個但願生成的隨機數,所以c的取值必須儘量小。顯然,該算法的缺點是較難肯定g與c。
所以,僞隨機數生成器(PRNG)通常採用逆轉法,其基礎是均勻分佈,均勻分佈PRNG的優劣決定了整個隨機數體系的優劣。源碼

【均勻分佈】F(x)=(x-a)/(b-a),a≤x≤b,即一維的比例關係。

【Java實現僞隨機數的源碼】

// nextInt() -> next(32)

    protected int next(int bits) {
        long oldseed, nextseed;
        AtomicLong seed = this.seed;
        do {
            oldseed = seed.get();
            nextseed = (oldseed * multiplier + addend) & mask;
        } while (!seed.compareAndSet(oldseed, nextseed));
        return (int)(nextseed >>> (48 - bits));
    }

//返回nextseed的16位以上的高位
//seed.compareAndSet(oldseed, nextseed)是線程安全檢查,並把nextseed賦值給oldseed
//nextseed的計算爲(oldseed * 25214903917 + 11) & ((1L << 48) - 1),即乘法加法後,除以281474976710656取餘數
//沒搞明白multiplier和addend的值有什麼蹊蹺。簡單來講就是乘以multiplier加上addend而後對mask取餘。

【參考資料】度娘,維基百科,JRE源碼,及其餘。

相關文章
相關標籤/搜索