一、rand()
函數名: rand
功 能: 随機數發生器
用 法: int rand(void);
所在頭檔案: stdlib.h
函數說明 :
rand()的内部實作是用線性同餘法做的,它不是真的随機數,因其周期特别長,故在一定的範圍裡可看成是随機的。
rand()傳回一随機數值的範圍在0至RAND_MAX 間。RAND_MAX的範圍最少是在32767之間(int)。用 unsigned int 雙位元組是65535,四位元組是4294967295的整數範圍。0~RAND_MAX每個數字被選中的機率是相同的。
使用者未設定随機數種子時,系統預設的随機數種子為1。
rand()産生的是僞随機數字,每次執行時是相同的;若要不同,用函數srand()初始化它。
程式例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<code>#include <iostream></code>
<code>using</code> <code>namespace</code> <code>std;</code>
<code>#include <stdlib.h> </code>
<code>#include <time.h></code>
<code>#define MIN 1 //随機數産生的範圍 </code>
<code>#define MAX 10</code>
<code>int</code> <code>main() </code>
<code>{</code>
<code> </code><code>int</code> <code>i;</code>
<code> </code><code>srand</code><code>((unsigned)</code><code>time</code><code>(0));</code>
<code> </code><code>cout<<</code><code>"Ten random numbers from "</code><code><<MIN<<</code>
<code> </code><code>" to "</code><code><<MAX<<</code><code>" :/n"</code><code><<endl; </code>
<code> </code><code>for</code><code>(i=0; i<10; i++) </code><code>//産生随機數</code>
<code> </code><code>{</code>
<code> </code><code>cout<<MIN + (</code><code>int</code><code>)MAX * </code><code>rand</code><code>() / (RAND_MAX + 1)<<</code><code>"/t"</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>cout<<endl;</code>
<code> </code><code>return</code> <code>0; </code>
<code>}</code>
二、srand()
函數名: srand
功 能: 初始化随機數發生器
用 法: void srand(unsigned int seed);
所在頭檔案: stdlib.h
函數說明:
srand()用來設定rand()産生随機數時的随機數種子。
參數seed必須是個整數,通常可以利用time(0)的傳回值或NULL來當做seed。
如果每次seed都設相同值,rand()所産生的随機數值每次就會一樣。
程式例:
<code>#define MIN 0 //随機數産生的範圍 </code>
<code>#define MAX 99</code>
<code> </code><code>srand</code><code>((unsigned)</code><code>time</code><code>(NULL));</code>
<code> </code><code>cout<<MIN + </code><code>rand</code><code>() % (MAX + MIN - 1)<<</code><code>"/t"</code><code>;</code>
三、rand()和srand()的關系
rand()和srand()要一起使用,其中srand()用來初始化随機數種子,rand()用來産生随機數。
因為預設情況下随機數種子為1,而相同的随機數種子産生的随機數是一樣的,失去了随機性的意義,是以為使每次得到的随機數不一樣,用函數srand()初始化随機數種子。srand()的參數,用time函數值(即目前時間),因為兩次調用rand()函數的時間通常是不同的,這樣就可以保證随機性了。
四、産生一定範圍随機數的通用表示公式
要取得[a,b)的随機整數,使用(rand() % (b-a))+ a (結果值含a不含b)。
要取得[a,b]的随機整數,使用(rand() % (b-a+1))+ a (結果值含a和b)。
要取得(a,b]的随機整數,使用(rand() % (b-a))+ a + 1 (結果值不含a含b)。
(總的來說,通用公式:a + rand() % n ;其中的a是起始值,n是整數的範圍)
要取得a到b之間的随機整數,另一種表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之間的浮點數,可以使用rand() / double(RAND_MAX)。
五、産生相同的随機數的原因
計算機的随機數都是由僞随機數,即是由小M多項式序列生成的,其中産生每個小序列都有一個初始值,即随機種子。(注意: 小M多項式序列的周期是65535,即每次利用一個随機種子生成的随機數的周期是65535,當你取得65535個随機數後它們又重複出現了。)
我們知道rand()函數可以用來産生随機數,但是這不是真真意義上的随機數,是一個僞随機數,是根據一個數(我們可以稱它為種子)為基準以某個遞推公式推算出來的一系列數,當這系列數很大的時候,就符合正态公布,進而相當于産生了随機數,但這不是真正的随機數,當計算機正常開機後,這個種子的值是定了的,除非你破壞了系統。
程式示例:
<code>#include <stdlib.h></code>
<code>#include <time.h></code>
<code>int</code> <code>main()</code>
<code> </code><code>for</code> <code>(i=0; i<10; i++) </code><code>//産生10個随機數</code>
<code> </code><code>cout<<</code><code>rand</code><code>()<<</code><code>"/t"</code><code>;</code>
<code> </code><code>return</code> <code>0;</code>
每次運作得到相同的随機序列:
41 18467 6334 26500 19169 15724 11478 41 18467 6334 26500 19169 15724 11478 29358 26962 24464
為得到不同的随機數序列,則需改變這個種子的值。方法:在開始産生随機數前,調用一次srand(time(NULL))(注意:srand()一定要放在循環外面或者是循環調用的外面,否則的話得到的是相同的随機數)。
<code> </code><code>srand</code><code>((unsigned)</code><code>time</code><code>(NULL)); </code><code>//初始化随機數種子</code>
<code> </code><code>for</code> <code>(i=0; i<10; i++) </code><code>//産生10個随機數</code>
每次運作得到不同的随機序列:
1294 18562 14141 18165 11910 29784 11070 13225 131 24405
1774 25714 18734 16528 20825 17189 9848 8899 2503 5375
本文轉自xuzw13 51CTO部落格,原文連結:http://blog.51cto.com/xuzhiwei/1353978,如需轉載請自行聯系原作者