关于随机数的算法问题?

qiougelsy 2003-04-11 08:12:18

void CGuessDlg::OnButton1()
{
int temp,pnum[35],num[7]; //临时变量,临时数组
for(int i=0;i<35;i++) //共有36个数组元素
pnum[i]=i+1;
//***选号***//
for(i=0;i<7;i++)
{
srand( (unsigned)time( NULL ) );
temp=rand();
temp=temp%36+1; //得到一个1-36的数
while(pnum[temp]==0)//如果此元素以被选过则重选
{
srand( (unsigned)time( NULL ) );
temp=rand();
temp=temp%36+1;
}
num[i]=temp; //选定一个号码
pnum[temp]=0; //给该元素置0,表示已被选过,如再有视为无效。
}
以上算法是www.vchelp.net 上的专栏作者雷神的彩票算法,他求的是7位数,
但我发现 当求超过10位数 时就会死机?
我发现问题的关键在于 While 循环,请教大家有没有好的算法 ?
...全文
35 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
DavidBone 2003-04-15
  • 打赏
  • 举报
回复
up
shilong 2003-04-12
  • 打赏
  • 举报
回复
死机可能是因为出现36的情况

取出来的数均为2位数

你可以分开取随机值

个位 0-6
十位 0-3

然后保证不大于36,而且不重复就行了
只是设想,也许这样花的时间会少点
还有初始化随机数用一个程序里用一次就够了
你用到while里,大大浪费时间
Jakecat 2003-04-12
  • 打赏
  • 举报
回复
当rand一个数发现他已经选过后 不再rand 而寻找连着的下一个 一直找到没选过的
maoxianwang 2003-04-12
  • 打赏
  • 举报
回复
用list不行吗?

链表加隋机,非常容易呀

你上边的代码的计算父杂度太大了

菜牛 2003-04-12
  • 打赏
  • 举报
回复
while耗时太长,当然有问题。
可是还有一个问题:当temp=36的时候,这是可能的,pnum[36]是越界的,因为定义的是int pnum[35]。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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