概述
写下面的代码时碰到的一些问题 包括生成不重复随机数和随机数相同
买彩票规则:“双色球”每注投注号码由6个红色球号码和1个蓝色球号码组成。
红色球号码从1–33中选择;蓝色球号码从1–16中选择。
重点是生成不重复的随机数。
编写程序:输入想要购买的彩票数z,输出z张彩票
遇到的问题是:生成多张彩票数时,间隔彩票的号码数(生成的随机数)是相同的;
其实是上学期的题,上学期犯得错,拖到现在才想着解决,
将所有数据输出后发现原因是k的值是相同的(k见下)
int myrand(int a[],int n,int m)
{
srand((unsigned)time(NULL));
int k;
k=1+rand()%(n-m);
swap(a+k,a+n-m);
return(a[n-m]);
}
后来找到原因:srand((unsigned)time(NULL));语句插在myrand函数中,而每次while循环所用的时间都远远小于1s,所以种子没有改变,结合我生成不重复随机数的方法,所以出现了诡异的间隔重复现象
解决方法就很简单啦,把srand((unsigned)time(NULL));语句放到main函数下就好啦,不能放在循环里;
下面写一下生成不重复随机数的方法:
先贴代码
for(i=0;i<RR;i++)//赋值
red[i]=i+1;
for(i=0;i<R;i++)//循环调用myrand函数
redball[i]=myrand(red,RR,i+1);
int myrand(int a[],int n,int m)
{
int k;
k=1+rand()%(n-m);//k是从1到最末尾一个数之间生成的随机数
swap(a+k,a+n-m);//调用交换函数,使第k个值与最末尾的值交换
return(a[n-m]);//返回最末尾的值
//再次进入循环时,由于i的值增加一个,所以导致上面说的最末值向前移动一位,重复上面的操作
}
以下为随机生成彩票的全部代码
#include<stdio.h>
#include <time.h>
/*
买彩票规则:“双色球”每注投注号码由6个红色球号码和1个蓝色球号码组成。
红色球号码从1--33中选择;蓝色球号码从1--16中选择。
重点是生成不重复的随机数
*/
#define RR 33
#define BR 16
#define R 6
#define B 1
void swap(int* q, int* p)//交换
{
int tmp;
tmp=*q;
*q=*p;
*p=tmp;
}
int myrand(int a[],int n,int m)
{
int k;
k=1+rand()%(n-m);
swap(a+k,a+n-m);
return(a[n-m]);
}
void select(int a[])
{
int i,j,min;
for(i=0;i<R;i++)
{
min=i;
for(j=i;j<R;j++)
{
if(a[min]>a[j])
min=j;
}
swap(a+min,a+i);
}
}
int main()
{
srand((unsigned)time(NULL));
int z,red[RR],redball[R],i,count=0;
int buleball[BR],bule[BR];
printf("你想买几注:");
scanf("%d",&z);
for(i=0;i<RR;i++)
red[i]=i+1;
for(i=0;i<BR;i++)
bule[i]=i+1;
while(count<z)
{
count++;
for(i=0;i<R;i++)
redball[i]=myrand(red,RR,i+1);
for(i=0;i<B;i++)
buleball[i]=myrand(bule,BR,i+1);
printf("<%2.0d> ",count);
select (redball);
for(i=0;i<R;i++)
{
printf("%02d ",redball[i]);
}
printf("-- ");
for(i=0;i<B;i++)
{
printf("%02d ",buleball[i]);
}
putchar('n');
}
}
最后
以上就是犹豫冬日为你收集整理的c语言 不重复随机数以及随机数间隔重复问题的全部内容,希望文章能够帮你解决c语言 不重复随机数以及随机数间隔重复问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复