srand()可以傳入一個整數參數,稱為亂數種子。不同的亂數種子會形成不同的亂數序列,而相同亂數種子的亂數序列相同,代表不同執行階段的相同取亂數序列會獲得同一數字,例如每次執行程式所取得的第1個亂數都是同一個數字。
srand()可省略。實際上,省略srand()的效果等於srand(1)。例如以下兩段程式會獲得相同的執行結果。
#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 <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;
}
沒有留言:
張貼留言