随机抽奖程序

艾薇儿More 2013-04-13 07:36:28
web课上写个抽奖程序,分别是一等奖1个,二等奖3个,三等奖6个,从20(假设的这个不重要)个人数中抽取10个获奖的人数,输出获奖的号码和等级。
用c写了个程序,但是不完美,死循环,莫非我随机函数弄坏了,目前没解决,算法还没想出来。和大家分享一下,望大神帮忙啊 代码如下

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
#define MAX 100
#define total 10
bool choice(int le);
struct ob{
int num;
int level;
bool flag;

};
typedef ob object;
int le1=0,le2=0,le3=0;
int main()
{
object arr[20];
int i=0,le,ran,j=0;
for(i=0;i<20;i++)
{
arr[i].num=i;
arr[i].level=0;
arr[i].flag=false;
}
for(i=0;i<20;i++)
printf("%d\n",arr[i].num);
i=0;
printf("it is beginng ......... ..\n");
while(i<10)
{
//srand(time(NULL));
ran=rand()%20;
le=rand()%3+1;
if(choice(le)){
if(!arr[ran].flag)
{


arr[ran].num=ran;
arr[ran].level=le;
arr[ran].flag=true;
printf("ran= %d,le = %d\n",ran,arr[ran].level);
i++;
printf("i is %d\n",i);
}

}

}

return 0;
}
bool choice(int le){

if((le1<total)||(le2<total)||(le3<total)){
switch(le)
{
case 1:le1++;break;
case 2:le2++;break;
case 3:le3++;break;
}
if(le1>1)
{
le1=total;
return false;
}
else if(le2>3){
le2=total;
return false;
}
if(le3>6){
le3=total;
return false;
}
return true;

}
return true;
}

...全文
254 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gonefar 2013-04-16
  • 打赏
  • 举报
回复
ran=rand()%20;
le=rand()%3+1;
你这里的两个rand()应该是一样的值,最好用两个随机函数,一个产生序号,一个产生中奖。
艾薇儿More 2013-04-16
  • 打赏
  • 举报
回复
问题差不多解决了,随机数没搞好,算法没问题了,只是效率不高。正如你说,下次还是1,那么说明随机数有问题重新分配,这里的判断就是想告诉随机数是否有效,等级是否有效,两者成立才可以啊,还有,单步调试,我的vc6.0不显示具体变量和数值,地址了,看也不看。就是随机数每次都是相同的话肯定不对了,就像你说死循环。不过还是谢谢你了,
goog_guzl 2013-04-16
  • 打赏
  • 举报
回复
出现以上的问题 正是应为每次的随机数都是一样的
goog_guzl 2013-04-16
  • 打赏
  • 举报
回复
算法有问题。假如第一次le为1,程序正常。如果第二次le还是1呢?le1此时为2. if(le1>1) { le1=total; return false; } 问题就在这里。le1为total!!!!以后返回的都是false!!!循环中的i++永远都不会执行了。恭喜你程序进入死循环。 要学会单步调试。
艾薇儿More 2013-04-15
  • 打赏
  • 举报
回复
引用 5 楼 Gonefar 的回复:
srand(time(NULL));要在循环外面!
外面也是一样的,choice最后返回的应该是false才满足要求的。效率不高,觉得应该是算法问题吧,不过谢谢你看过
Gonefar 2013-04-15
  • 打赏
  • 举报
回复
srand(time(NULL));要在循环外面!
艾薇儿More 2013-04-15
  • 打赏
  • 举报
回复
没有人帮忙解决一下吗?
艾薇儿More 2013-04-13
  • 打赏
  • 举报
回复
敬请高手解答,给分只是一种鼓励,重在交流。小弟不胜感激
Code_Talk 2013-04-13
  • 打赏
  • 举报
回复
结贴拿分? 嘻嘻
艾薇儿More 2013-04-13
  • 打赏
  • 举报
回复
其实choice函数最后返回是false,我是为了检验死循环改了个true;疏忽哈

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧