(本文為原創,轉貼請註明出處:http://blog.csdn.net/kyosukeno1)
在自然界中,雖然存在著一定的客觀規律,但並沒有絕對的可能性和不可能性。因此,使用隨機概率去描述事物的發生與消亡,最能貼切反應事物原有特徵。
隨機函式最一般性的運用,莫過於使用
%來簡單的限制隨機數值的大小――相信經常使用
random
函式的讀者,對
random() % random_range
的隨機機率產生已經十分的熟悉了,然而,在實際的應用中,隨機機率有著更複雜的應用。本文將介紹
2種隨機機率使用方面的小竅門,以之拋磚引玉,希望能引起讀者們的一點討論。
小竅門一:累計型隨機機率的快速查詢。 假設
a的機率是25,
b的機率是35,
c的機率是
20,那麼怎麼才能用最簡單的方法去隨機的、按照設定的概率去得到隨機數呢?以下是以
c++的實現**:
int i; //
用做迴圈的變數(廢話
-_-b
)int nprob = ; //
設定各元素的概率
int nsum = 0; //
儲存概率總數的變數
for( i=0; i
nsum += nprob[i]; //
計算概率的總數
int nrand = rand() % nsum; //
取乙個在概率的總數範圍內的隨機數
for( i=0; i
if( nrand < nprob[i] ) else
}這種演算法的步驟很簡單:
首先把所有概率的總數統計出來,然後以此作為隨機數
nrand
的取值範圍。
依次把
nrand
和當前元素的概率比較,如果
nrand
小於這個概率,則命中這個元素,退出查詢。 如果
nrand
大於當前元素的概率,就用
nrand
減去該元素的概率,然後回到步驟
2,直至所有元素查詢完畢。
這種演算法的優點是計算量小,而且容易在不同的程式語言中使用。
小竅門二:機率可以表示為分母為
2的次方數時的快速查詢。
在某些情況下,當前需要計算的隨機機率可以表示為乙個分母為
2的此方數的分數:例如
1/4,
3/4,
1/16
,15/16
等等,這時只要以以下的公式,就能快速的計算:
// 例1
// 元素
a的概率是
1/4// 元素b
的概率是
3/4int nrand = rand() & 0x3;
if( nrand == 0 )
else
// 例
2// 元素a
的概率是
1/16
// 元素
b的概率是
15/16
int nrand = rand() & 0xf;
if( nrand == 0 )
else
vim使用之小竅門
一 vim如何把程式執行結果複製到程式檔案中 1 開啟兩個終端,乙個用於編寫程式,另乙個用於編譯和執行程式。2 執行完程式後,選取程式執行的結果,在另個終端按shift insert將程式執行結果複製到程式中。如下 二 vi vim 如何搜尋關鍵字或消除搜尋後的關鍵字高亮 在vi裡面如果要搜尋某個關...
google搜尋的使用小竅門
1 site的使用 site 網域名稱 搜尋關鍵字或者搜尋關鍵字 site 網域名稱 google中site 的使用方法總結 使用 site 搜尋運算子查詢違規內容 2 限定搜尋時間 before 2019 04 after now before 2019 04 after 2021 01 befo...
求職的小竅門
大學畢業季,回味之前幾年時光匆匆流逝,自己宛如一張白紙。就業 擇業 失業,接踵而來。就業 如汪洋大海,我猶如未起航的小船,停靠在溫暖的港灣。擇業 如汪洋大海中漂泊小船的風帆,迎風飄揚。失業 波濤洶湧的浪花拍打在猶弱的小船上,慢慢的吞噬。簡歷 面試 入職三部曲 簡歷 一般前程無憂 智聯招聘 如何吸引h...