/* ---------------------------------------
隨機點名 做習題
Author: emanlee
Date: 2008-04-24
--------------------------------------- */
#include "stdio.h"
#include "conio.h"
#include "time.h"
void main()
{
int count=4;
int i=0,k=0;
int randnumber;
int seed;
char ex_id[4][10]={"1.1","1.2","1.3","1.4"} ; /* 習題編號*/
while(i<count)
{
k++;
srand(time(0)+k*k);
randnumber =rand()%432;
if(randnumber<=131 && randnumber>=101 )
{
printf("學號為 %d 的同學做習題 %s\n\n",randnumber,ex_id[i]);
i++; continue;
}
if(randnumber<=231 && randnumber>=201 )
{
printf("學號為 %d 的同學做習題 %s\n\n",randnumber,ex_id[i]);
i++;continue;
}
if(randnumber<=331 && randnumber>=301 )
{
printf("學號為 %d 的同學做習題 %s\n\n",randnumber,ex_id[i]);
i++;continue;
}
if(randnumber<=431 && randnumber>=401 )
{
printf("學號為 %d 的同學做習題 %s\n\n",randnumber,ex_id[i]);
i++; continue;
}
}
getch();
}
/* --------------------------------------*/
標準C庫中函數rand()可以產生0~RAND_MAX之間的一個隨機數,其中RAND_MAX 是stdlib.h 中定義的一個整數,它與系統有關。
rand()函數沒有輸入參數,直接通過運算式rand()來引用;例如可以用下面的語句來列印兩個隨機數:
printf("Random numbers are: %i %i\n",rand(),rand());
因為rand()函數是按指定的順序來產生整數,因此每次執行上面的語句都列印相同的兩個值,所以說C語言的隨即並不是正真意義上的隨機。
為了時程式在每次執行時都能產生一個新序列的隨機值,我們通常通過為隨機數產生器提供一粒新的隨機種子。函數srand()(來自stdlib.h)可以為隨機數產生器播散種子。只要種子不同rand()函數就會產生不同的隨機數序列。srand()稱為隨機數產生器的初始化器。
常式:
檔案名稱: rand_srand.c
/* This program generates and prints ten random integers between 1 and RAND_MAX*/
#include <stdio.h>
#includ <stdlib.h>
int main()
{
usigned int seed; /*申明初始化器的種子,注意時usigned int 型的*/
int k;
pringt("Enter a positive integer seed value: \n");
scanf("%u",&seed);
srand(seed);
printf("Random Numbers are:\n");
for(k = 1; k <= 10; k++)
printf("%i",rand());
printf("\n");
return 0;
}
你會發現,當你提供的種子相同時,隨機數序列也時相同的。而且當種子為1時,與不使用srand()函數時一樣的,也就是說rand()函數預設情況下初始化種子值為1;
在stdlib.h 中這兩個函數的原型是:
int rand();
void srand (unsigned int);
擴充:
x = rand()%11; /*產生1~10之間的隨機整數*/
y = rand()%51 - 25; /*產生-25 ~ 25之間的隨機整數*/
z = ((double)rand()/RAND_MAX)*(b-a) + a;/*產生區間[a,b]上的隨機數*/