5634 2 隨機數生成器的應用1 二項分布

2021-08-30 04:37:09 字數 1324 閱讀 8995

今天來更新一下關於隨機數生成器的應用。

那麼廢話不多說,首先給出最簡單的rand()用法:

// srand所在的標頭檔案

#include// time引數所在標頭檔案

#include ...

// 生成 [0,1) 的隨機數(double)

double rng()

int main(void)

有意思的是,time(1)與time(0)似乎並沒有什麼區別,關於這兩個的討論可以參見:

另外,在網上可以隨隨便便搜尋到很多關於rand()表示式的用法舉例,在此隨意貼出一二:

要取得[a,b)的隨機整數,使用(rand() % (b-a))+ a; 

要取得[a,b]的隨機整數,使用(rand() % (b-a+1))+ a; 

要取得(a,b]的隨機整數,使用(rand() % (b-a))+ a + 1; 

通用公式:a + rand() % n;其中的a是起始值,n是整數的範圍。 

要取得a到b之間的隨機整數,另一種表示:a + (int)b * rand() / (rand_max + 1)。 

要取得0~1之間的浮點數,可以使用rand() / double(rand_max)。

好,那麼現在問題來了:這東西能用來幹嘛呢?

um...我不知道各位讀者能用來幹嘛,反正我們的作業要用來生成二項分布...

考慮乙個簡單的二項分布:發生事件的概率p為0.2,重複5次試驗,且用上述提到的rand()函式來生成。

二項分布嘛,結果不是true就是false,非1即0嘛。所以,可以考慮生成[0,1)區間內的隨機數,然後令隨機數小於等於0.2的輸出值為1,否則輸出0.

那麼這樣一來就很簡單了。在此基礎上,如果要進行n組這樣的實驗(每組實驗重複5次,每次實驗為1的概率為0.2),然後將結果與實際的二項分布結果對比,以此衡量我們用隨機數生成器所構造的二項分布是否確實「有效地」模擬了二項分布。

那麼廢話不多說,show you my code:

#include#include#include// 隨機數生成器

double rng()

int main(void)

*/// n = 5, p = 0.2

n = 5;

p = 0.2;

// n=10,100,1000

for(n = 1; n <= 2; n++)

}//fclose(fpwrite);

}

從結果上來看,當n越大,則隨機數生成器模擬的二項分布將會無限接近實際的二項分布。

隨機數生成器

標頭檔案 內容 rand,srand函式和rand max常量 rand max 在windows系統中為32767 在類unix系統中為2147483647 rand 函式返回乙個0 rand max的隨機整數 srand seed 函式 接受unsigned int 型別的引數seed,以see...

MATLAB隨機數生成器

1 rand 生成 0,1 區間上均勻分布的隨機數 基本語法 rand m,n,p 生成排列成m n p 多維向量的隨機數。如果只寫m,則生成m m矩陣 如果引數為 m,n 可以省略方括號。2 randn 生成服從標準正太分布 均值為0,方差為1 的隨機數 基本語法 randn m,n,p,解釋同1...

隨機數生成器,隨機種子

遊戲中經常要用到隨機數,但如果乙個沒有隨機種子的的生成器,就沒法重複之前的隨機數了。js的math.random就用不了隨機種子,只好自己弄了乙個,有了隨機種子,每次只要傳入相同的種子,都會得到同樣的隨機數。直接 function seededrandom seed,min,max 這是一種偽隨機數...