不重复随机点名程序
上一篇博客中记录了随机点名,但是总有一些所谓的“天选之人”,点名十有八九可能是他,但这不是程序问题,是概率问题,是运气太好造成的,比如课堂提问,总一个人也会不好,所以在上个博客的基础上进行了改进,使被点名的人不会再次被点;
具体代码参考 “随机点名”;
原理:
原理相同,详细查看本篇博客的上一篇,包括随机数的产生,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;
}
代码解释:
本代码采用封装思想,将产生随机名字部分封装成函数,使程序变得条理清晰,没有什么难点,只是将随机的名字在数组中删除,具体删除方式,找到产生的名字在数组中的位置,让它的后一位成员赋值前面成员,最后缩短数组长度,所以实现不重复点名;
仅供参考,还是菜鸟;