2010年4月12日 星期一

亂數

C語言要使用亂數需要兩個函數的搭配,分別是srand()rand()srand()是用來變更亂數序列,而rand()則是逐次依序取得亂數序列中的數字,每次取得的數字範圍在0~0X7FFF(32767)。

srand()可以傳入一個整數參數,稱為亂數種子。不同的亂數種子會形成不同的亂數序列,而相同亂數種子的亂數序列相同,代表不同執行階段的相同取亂數序列會獲得同一數字,例如每次執行程式所取得的第1個亂數都是同一個數字。
srand()可省略。實際上,省略srand()的效果等於srand(1)。例如以下兩段程式會獲得相同的執行結果。

#include <stdlib.h>
#include <stdio.h>
int main()
{
    printf("亂數1: %d\n",rand());
    printf("亂數1: %d",rand());
    system("pause");
    return 0; 
}

#include <stdlib.h>
#include <stdio.h>
int main()
{
    srand(1);
    printf("亂數1: %d\n",rand());
    printf("亂數1: %d",rand());
    system("pause");
    return 0; 
}

每次執行程式要使用不同的亂數種子可採手動或自動的方式。手動的方式可利用scanf()函數讓使用者決定亂數種子,如下段程式所示:

#include <stdlib.h>
#include <stdio.h>
int main()
{
    int seed;
    printf("請輸入種子:");
    scanf("%d",&seed);
    srand(seed);
    printf("亂數1: %d\n",rand());
    printf("亂數1: %d",rand());
    system("pause");
    return 0; 
}

自動變更亂數種子則使用time.h裡的time()函數來產生不同的數字當成種子,提供給srand()使用。如下段程式所示:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
    long longtime;
    srand(time(&longtime)%60);
    printf("亂數1: %d\n",rand());
    printf("亂數1: %d",rand());
    system("pause");
    return 0; 
}

每次利用rand()取得的數字在0到32767之間,如果想要控制亂數數子在某一個範圍,例如1到50之間,可以利用%50將rand()的數字控制在0~49之間,再加上1即可達成。那麼如果想要控制在0~50之間呢?利用%51即可。那如果我想要數字在6~10之間呢?先控制亂數在0~10之間,再判斷數字是否大於5,如果是就採用,不是再重新取一次亂數值,如下段程式所示:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int myrand();
int main()
{
    int i;
    long longtime;
    srand(time(&longtime)%60);
    for(i=0;i<10;i++){
       printf("亂數: %d\n",myrand());
    }
    system("pause");
    return 0; 
}
int myrand(){
    int num;
    do{
        num=rand()%11;
    }while(num<6);
    return num;   
}

沒有留言:

張貼留言