天天看點

C++中随機函數rand()和srand()的用法

一、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 &lt;iostream&gt;</code>

<code>using</code> <code>namespace</code> <code>std;</code>

<code>#include   &lt;stdlib.h&gt;  </code>

<code>#include   &lt;time.h&gt;</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&lt;&lt;</code><code>"Ten random numbers from "</code><code>&lt;&lt;MIN&lt;&lt;</code>

<code>          </code><code>" to "</code><code>&lt;&lt;MAX&lt;&lt;</code><code>" :/n"</code><code>&lt;&lt;endl; </code>

<code>    </code><code>for</code><code>(i=0; i&lt;10; i++)          </code><code>//産生随機數</code>

<code>    </code><code>{</code>

<code>        </code><code>cout&lt;&lt;MIN + (</code><code>int</code><code>)MAX * </code><code>rand</code><code>() / (RAND_MAX + 1)&lt;&lt;</code><code>"/t"</code><code>;</code>

<code>    </code><code>}</code>

<code>    </code><code>cout&lt;&lt;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&lt;&lt;MIN + </code><code>rand</code><code>() % (MAX + MIN - 1)&lt;&lt;</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 &lt;stdlib.h&gt;</code>

<code>#include &lt;time.h&gt;</code>

<code>int</code> <code>main()</code>

<code>    </code><code>for</code> <code>(i=0; i&lt;10; i++)      </code><code>//産生10個随機數</code>

<code>        </code><code>cout&lt;&lt;</code><code>rand</code><code>()&lt;&lt;</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&lt;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,如需轉載請自行聯系原作者

繼續閱讀