利用隨機函式生成隨機數

2021-06-28 03:48:25 字數 1956 閱讀 8039

給定乙個rand(),可以產生從0到rand_max的隨機數,其中

rand_max

很大(常見值:16位int能表示的最大整數32767),寫出利用rand()生成[a,b]中任意整數的函式,其中a>=0, b<=rand_max,且b-a<

分析:

這是在程式設計工作最常見的隨機函式的應用,在這裡做乙個起點再合適不過。把隨機數區間的起點從0變為a,同時把一共rand_max+1個數的區間縮小至只含有b-a+1個數的區間,寫為 a + rand()%(b-a+1),此時顯然最大值是a+(b-a)= b。

進一步地,這個b-a<

附加思考:

如果b-a和rand_max很接近會發生什麼情況?讀者不妨先做思考,問題2的分析會做出解答。

這個rand(),其實相當於《程式設計珠璣》提到的bigrand()。

假設:乙個能返回很大隨機整數的的函式bigrand(),乙個能返回i..j範圍內均勻選擇的隨機整數函式randint(i,j)。

在c語言中,隨機函式rand()通常返回約15個隨機位,可以使用該函式實現上述bigrand()和randint()函式。

int bigrand()

int randint(int l, int u)

給定乙個隨機數函式rand7(),它能以等概率生成1~7這7個整數。請根據rand7()寫出類似的rand5()。

分析:如果直接像問題1中一樣,把1+rand7()%5作為rand5()會有什麼情況發生?這時確實能產生1~5的隨機數沒錯,可是各個數的概率相等嗎?

對於隨機數2,既有可能來自於1+1%5,也有可能來自於1+6%5,顯然其概率是2/7,而不是1/5,不滿足rand5()等概率產生各隨機數這一隱含要求。不同於問題1,問題1中乙個很大的區間收縮成較小區間時,各個元素對映後的新元素概率雖然概率可能不完全一樣,但卻是近似相同的。

為了滿足等概率的要求,可以這麼做:

int rand5()  while(t>=6);

return res;

}

雖然保證了1~5的概率都變成了1/5,但是有乙個無法避免的缺點是,每當產生了6或者7都要拋棄,相當於這一次執行是「空轉」,浪費了時間。

如果對1/5這個概率不明白,可以有兩種理解:每次產生6或7就被拋棄,剩下數的概率相等,必然為1/5;或者用更嚴密的推理:產生1~5的隨機數,最終得到某乙個的概率為:1/7+(1/7)*(2/7)+(1/7)*(2/7)2+...,無限項求和,結果是1/5。

給定乙個隨機數函式rand7(),它能以等概率生成1~7這7個整數。請根據rand7()寫出類似的rand10()。

分析:有了問題2的概率基礎,把rand7()變成rand10()僅僅需要一點點思考了。

int rand10()  while(t1>=6);

//t1以等概率成為1/5

do while(t2==7);

//t2以1/2概率成為奇數或偶數

res = t1+5*(t2%2);

//res是1~10中的任意乙個數的概率都是1/10

//注意到%和*具有相同的優先順序,這裡去掉括號結果是錯的

return res;

}等概率的rand10()

等概率的rand10()

給定能隨機生成整數1到5的函式,寫出能隨機生成整數1到7的函式。

利用隨機函式rand()函式生成乙個等概率隨機生成整數1到5的函式rand5(),然後根據rand5()生成rand7(),**如下:

int rand5()  

int rand7()

while (n>21);//當n>21捨去,這樣n只能取1~21,對7取模就能取1~7之間的隨機數

return 1+n%7;

}

參考

隨機生成隨機數

現畫乙個command命令按鈕,進行貼上。private sub command1 click show me scale 0,0 18,8 me.auto redraw true me.draw mode 2 circle 3,4 3,vb red me.auto redraw false lin...

隨機數生成 偽隨機數和真隨機數

c語言隨機數的生成,很隨機,又不隨機,比如像下面的程式 c語言生成隨機數的函式在stdlib.h庫中 include includeint main return 0 上面的 經過執行生成了 41 18467 6334 26500但是無論執行多好遍結果都是一樣的,隨機數並不隨機。這是因為rand 函...

隨機數生成

原型 void srand unsigned seed 用法 srand和rand 配合使用產生偽隨機數序列。rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。sr...