其实就是CPrimerPlus第十六章第五题,只不过我把标题写的更生动些啦。
刚开始我理解两次选的人不一样就行了,于是只安排了连续两次选人之间对比,人相同了那么就将第二次选择作废,重来一次,直到选的人不同才采用,这时计数器加1(计数器达到8就停止)。
当然,这种方法是不符合题意的,因为第二次选的幸运观众不会和第一次选的相同,但是第三次可以和第一次相同啊。这样就会有幸运观众多次被选中了。
void RandPrint1(int * p, int size, int num) //p是int数组,可理解为观众的标号(1-10);size表示观众的总数量(10);num表示要抽取的幸运观众的数量(比如是8)。
{int i=0;int PreRand=-1;intRand;
srand((unsigned) time(NULL));//用时间做种,每次产生随机数不一样for(i=0; i
Rand=((int)rand() %size);if(Rand !=PreRand) //抽取的幸运观众号码与上一个幸运观众号码不同,即两个幸运观众不是同一个人
{
printf("%d", *(p+Rand));
i++;
}
PreRand=Rand; //这个幸运观众下一轮抽取中就变成了“上一个幸运观众”咯
}
}
第二种方法的话,采用选一个幸运观众,就把他从候选人名单中剔除,免得再选中。而且越选越少,越选越简单明了。就是把存着观众号码的内存不断的移动,覆盖掉已经备选的观众的号码,在