rand 之間相互生成總結

2022-04-04 08:04:55 字數 2476 閱讀 9909

先舉乙個之前看過的例子:(引自

給乙個方法,比如 rand5(), 它能夠等概率生成 1-5 之間的整數。 所謂等概率就是1,2,3,4,5 生產的概率均為 0.2 。現在利用rand5(), 構造乙個能夠等概率生成 1- 7 的方法?

思路:很多人的第一反應是return rand5()+rand5()%3; 這個實現確實能產生1-7之間的隨機數,但是問題在於分布是不均勻的。rand5()%3產生0的概率是1/5,而產生1和2的概率都是2/5。所以這個實現產生6和7的概率要大於產生5的概率。

這裡有兩個特別重要的點,一是 如同上面思路,如果 rand5() + rand5(), 我們能夠產生乙個均勻分布的1 - 10 嗎? 答案是否定的。比如對於 6來講(4+2, 2+4, 3+3),它被生成的生成的概率比1 (1+0,0+1)要大.

第二個點就是我們不可能用rand5()直接產生 1- 7 的數,不管你用加減乘除都不行。

所以,我們要構造乙個更大的範圍,使得範圍裡每乙個值被生成的概率是一樣的,而且這個範圍是7的倍數,我們從下面的**中來分析如何解決上面兩個問題:

int rand7()   

}  }  

第三行**產生乙個均勻分布的 0, 5, 10, 15, 20的數。

第四行**產生乙個均勻分布的 0, 1, 2, 3, 4 的數。

相加以後,會產生乙個 0到24的數,而且每個數(除0外)生成的概率是一樣的。我們只取 1 - 21 這一段,和7 取餘以後+1就能得到完全均勻分布的1-7的隨機數了。

後來看到另外一篇文章介紹的極其詳細,果斷學習之

學習之餘,順便**下rand()函式本身

函式rand()是真正的隨機數生成器,而srand()會設定供rand()使用的隨機數種子。函式rand()會返回乙個處於0和你所指定的數值(預設為1)之間的分數。如果你在第一次呼叫rand()之前沒有呼叫srand(),那麼系統會為你自動呼叫srand()。而使用同種子相同的數呼叫 srand()會導致相同的隨機數序列被生成。

srand((unsigned)time(null))則使用系統定時/計數器的值做為隨機種子,所以,在相同的平台環境下,顯示的隨機數會是偽隨機數,即每次執行顯示的結果會有不同

要注意的是所謂的「偽隨機數」指的並不是假的隨機數。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機數。計算機生 成的偽隨機數既是隨機的又是有規律的 —— 一部份遵守一定的規律,一部份則不遵守任何規律。

比如「世上沒有兩片形狀完全相同的樹葉」,這正點到了事物的特性 —— 規律性;但是每種樹的葉子都有近似的形狀,這正是事物的共性 —— 規律性。從這個角度講,我們就可以接受這樣的事實了:計算機只能產生偽隨機數而不是絕對的隨機數。

下面是c庫函式裡面的rand()**

1

【c語言庫函式rand()源**】

2 【本程式在dev c 4.9.9.2

下編譯通過】3/*

4這兩個函式是c庫中產生隨機數的程式。你需要先使用srand()函式賦隨機數種子值。然後再使用 rand()函式來產生隨機數。但是產生隨機數的演算法較簡單,srandom()和random()函式是對這兩個函式的改良,用法也很類似。5*/

6#define random_max 0x7fffffff78

static

long my_do_rand(unsigned long *value)922

static unsigned long next = 1;23

int my_rand(void)24

2728

void my_srand(unsigned int

seed)

2932

33 #include 34

intmain()

3544 system("

pause");

45return0;

46}47

rand()和random()的區別:

int rand(void):返回 0 ------rand_max 之間的乙個 int 型別整數,該函式為非執行緒安全函式。並且生成隨機數的效能不是很好,已經不推薦使用

long int random(void):返回 0 ------- rand_max 之間的乙個long 型別整數,該函式會產生乙個非常大的隨機值,最大為 16*((2**31)-1)。random 函式使用非線性反饋隨機數發生器生成預設大小為31個長整數表所返回的連續偽隨機數。

如果你使用 srandom 種植種子, 則你應該使用 random 返回隨機數, 如果你使用 srand 種植種子, 則你應該使用rand返回隨機數。

不過srand和rand官方已經不推薦使用。原因是產生隨機數的效能不是很好, 另外是隨機數的隨機性沒有random好, 再者就是不是執行緒安全。

rand5 和 rand7 相互生成

解題思路 此型別題目的解題主要注意生成的各個數字都是等概率的,不能夠使用取模等操作,因為會造成概率不均勻 rand7 生成rand5 rand7 的隨機數概率分布是1 7,我們在用其生成rand5 的時候只需要獲取1 2 3 4 5 五個即可,其餘兩個數 6 7 忽略 也就是 結果取res 1 51...

Doc View 之間相互訪問

1 在view中獲得doc指標 cyoursdidoc pdoc getdocument 乙個視只能有乙個文件。也可以 cmainframe pmain cmainframe afxgetmainwnd 3 在view中獲得mainframe指標 4 獲得view 已建立 指標 cyourview ...

人之間的尊重是相互的 人與人之間要學會相互尊重

第二是要有 三人行,必有我師 的良好心態。在我們的周圍,在我們生活的集體中,不乏學習的楷模。他們人儀表美 心靈美 語言美 品質美都是我們學習的好榜樣。他們淵博的知識,敏捷的思維,善辯的口才,傑出的才華,精湛的藝術,完美的人格,豐富的愛心,以及奉獻的精神等等,都是值得我們仰慕與學習的。只有我們時時 處...