c语言 不重复随机数以及随机数间隔重复问题

写下面的代码时碰到的一些问题 包括生成不重复随机数和随机数相同
买彩票规则:“双色球”每注投注号码由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');

    }


}

运行结果

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值