不重複隨機點名程序
上一篇博客中記錄了隨機點名,但是總有一些所謂的“天選之人”,點名十有八九可能是他,但這不是程序問題,是概率問題,是運氣太好造成的,比如課堂提問,總一個人也會不好,所以在上個博客的基礎上進行了改進,使被點名的人不會再次被點;
具體代碼參考 “隨機點名”;
原理:
原理相同,詳細查看本篇博客的上一篇,包括隨機數的產生,rand函數的運用,隨機數種子的生成;
程序代碼:
#include <stdio.h>
#include <sys/time.h>
#include <string.h>
char * week[]={"張 震","賈英楠","宋文碩","郭書城","李世超",
"羅 新","江偉東","劉明奇","周義航","趙 洋"};
char * rand_name(char *name[])
{
int num,i;
static char buf[100] = {0} ;
static int len = 0;
static int flag = 1;
if(flag == 1)
{
len = (sizeof(week)/sizeof(char*));
flag = 0 ;
}
for(i=0;i<1000;i++)
{
num = rand()%len ;
printf("%-10s\r",week[num]);
usleep(1000);
}
strcpy(buf,name[num]);
for(i=num;i<len-1;i++ )
{
name[i] = name[i+1] ;
}
len --;
return buf ;
}
int main()
{
int i ,num;
struct timeval tv ;
struct timezone tz ;
gettimeofday(&tv,&tz);
printf("usec=%ld\n",tv.tv_usec%100);
srand(tv.tv_usec%100);
for(i=0;i< (sizeof(week)/sizeof(char*)) ;i++)
{
printf("%s\n",rand_name(week) ) ;
}
return 0;
}
代碼解釋:
本代碼採用封裝思想,將產生隨機名字部分封裝成函數,使程序變得條理清晰,沒有什麼難點,只是將隨機的名字在數組中刪除,具體刪除方式,找到產生的名字在數組中的位置,讓它的後一位成員賦值前面成員,最後縮短數組長度,所以實現不重複點名;
僅供參考,還是菜鳥;