我是靠谱客的博主 犹豫冬日,最近开发中收集的这篇文章主要介绍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');

    }


}

运行结果

最后

以上就是犹豫冬日为你收集整理的c语言 不重复随机数以及随机数间隔重复问题的全部内容,希望文章能够帮你解决c语言 不重复随机数以及随机数间隔重复问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部