亂數的產生與使用對於電腦科學以及自然科學都有很重大的意義,20世紀初電腦的出生一部分的任務就是為了利用亂數計算出原子彈能不能爆炸。到了現代,統計學、電腦模擬、基因演算法等等先進的演算法仍然是建立在亂數上。最重要的,樂透電腦選號網路遊戲掉寶網路麻將洗牌註冊認證碼等等現代虛擬世界常見的功能,也是用亂數做的!!所以,學會怎麼使用亂數是很重要的!
  C語言的標準中內建了亂數函數srand()以及rand()。使用亂數前必須呼叫 srand()函式將亂數函數中的種子值(seed)初始化,不先呼叫本函數、或種子值固定,都會造成新手常見的「每次執行產生的亂數結果都相同」問題。為了方便起見可以使用 time(NULL)這個系統內的時鐘作為seed,使每次執行產生的亂數序列不同。一般而言,只需在程式開始使用亂數前呼叫一次srand()即可,不必重複呼叫 (也不要不小心把srand包在迴圈裏面)。rand()是一個亂數函數,每呼叫一次rand()會傳出一個新的亂數。
  在下面的程式中阿賢最簡單的示範如何使用srand、time將亂數初始化,並印出10次rand()亂數及RAND_MAX。

C_code
#include <stdio.h>
#include <stdlib.h>   /* rand(), srand(), RAND_MAX */
#include <time.h>     /* time(), clock()           */
int main(void){
    int i;
    srand( time(NULL) );

    for( i = 0; i < 10; i++)
        printf( "%10d / %10d\n", rand(), RAND_MAX );

    return 0;
}

  下面是程式在Dev-C++中的一次執行結果,每次執行結果應該都會有所不同:

C_code.GIF
     11949 /      32767
      7133 /      32767
     14740 /      32767
     17287 /      32767
       918 /      32767
     21540 /      32767
     28928 /      32767
     27847 /      32767
     18576 /      32767
     13647 /      32767

   RAND_MAX這個常數是rand()所能產生的最大亂數,定義在stdlib.h裡面。rand()產生的亂數範圍為: 0 <= rand() <= RAND_MAX。RAND_MAX的值隨著compiler的不同可能會有所變化。一些compiler如Dev-C++裡面RAND_MAX的值為215-1=32767,另一個常見的RAND_MAX的值為231-1=2147483647。您可以print出RAND_MAX來確認。一般而言RAND_MAX的值愈大愈好,原因留待下回分解。


第一次使用亂數就上手-目錄for C語言:

  第一次使用亂數就上手 - 1. 即用篇for C
  第一次使用亂數就上手 - 2. 基本篇for C
    基本篇範例一:蒙地卡羅法(Monte Carlo Method)求圓周率
    基本篇範例二:產生不重複樂透號碼
  第一次使用亂數就上手 - 3. 推廣篇for C
    產生常態分布亂數
    RAND_MAX的試煉:原理x限制x修正
  第一次使用亂數就上手 - 4. 原理篇for C
  第一次使用亂數就上手 - 5. 基本篇for C


創作者介紹
創作者 latinboy 的頭像
latinboy

阿賢的部落格

latinboy 發表在 痞客邦 留言(0) 人氣()