C语言生成一组不重复的随机数

#include<stdio.h>
#include<time.h>

void main(){
	// 确认数组范围 :
	int a_max,a_min,n;
	printf("请输入这组随机数最大值:");
	scanf("%d",&a_max);
	printf("请输入这组随机数最小值:");
	scanf("%d",&a_min);
	n=a_max-a_min+1;
	// 随机数生成代码: 
	int a[n],m,i,j;	//m为中介变量 
	srand(time(NULL));	//使生成真正随机的数 
	a[0]=rand()%n+a_min;
	for(i=1;i<n;i++){
		while(1){
			int s=0;
			m=rand()%n+a_min;
			for(j=0;j<i;j++){
				if (m==a[j]) s=1;	// 检查是否重复 
			}
			if(s==0) break;	//没有重复跳出循环 
		}
		a[i]=m;
	}
	// 随机数输出代码:
	for(i=0;i<n;i++){
		printf("%d\n",a[i]);
	}
}

效果如下

24年2月3日二编:

在我弟的指导下,改了个时间复杂度很低的版本,即使范围在6位数也能运行的很快,而上面写的代码会卡住。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int a[123456], b[123456]; //数组不定义在前面生成不了全为0的数组,devcpp中没遇到过这个问题

void main()
{
    // 确认数组范围
    int iMin, iMax, n;
    printf("Please Input the Minimum Number: ");
    scanf("%d", &iMin);
    printf("Please Input the Maximum Number: ");
    scanf("%d", &iMax);
    n = iMax - iMin + 1;
    srand(time(0));
    // 随机数记录在数组a下标:
    int r, i;
    for (i = 0; i < 123456; i++)
    { // 循环次数远远大于随机数数量确保一定能生成全部所需随机数
        r = rand() % n + iMin;
        if (a[r] == 0)
        { // 避免多次更改数组元素
            a[r] = i;
        }
    }
    // 将随机数转换为数组b元素:
    for (r = iMin; r <= iMax; r++)
    {
        b[a[r]] = r;
    }
    // 输出数组b元素:
    for (i = 0; i < 123456; i++)
    {
        if (b[i] != 0)
        {
            printf("%d\n", b[i]);
        }
    }
}

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值