C语言中生成随机数(任意范围随机数,并抽取其中某些数)

一,理解思路

产生所需范围随机数。
取其中n个随机数,去除重复随机数。
排序输出。

二,代码演示

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int comp_int(const void* e1, const void* e2) 
{
	return *(char*)e1 - *(char*)e2;
}
int main() 
{
	srand((unsigned)time(NULL));
    int rangStart = 0;//随机数的开始范围
	int rangEnd = 0; //随机数的结束范围
	scanf("%d-%d", &rangStart, &rangEnd);
	int amount = 0; //取随机数的个数
	scanf("%d", &amount);
	int i = 0;
	int randArr[100] = { 0 };
	for (i = 0; i < amount; i++) 
	{
		int j = 0;
		do 
		{
			randArr[i] = rand() % (rangEnd - rangStart + 1) + rangStart;
			//去除重复
			for (j = 0; j < i; j++) 
			{
				if (randArr[i] == randArr[j])
					break;
			}
		} while (i != j);
	}
	//排序-->可以使用冒泡排序
	qsort(randArr, amount, sizeof(randArr[0]), comp_int);
	//打印
	for (i = 0; i < amount; i++) 
	{
		printf("%d ", randArr[i]);
	}
	
	return 0;
}

运行结果:在这里插入图片描述

三,rand和srand

rand 随机数发生器,所需头文件stdlib.h srand 初始化随机数发生器,所需头文件stdlib.h 其中参数需要引用头文件time.h

rand()和srand()要一起使用,其中srand()用来初始化随机数种子,rand()用来产生随机数。

默认情况下随机数种子为1,相同的随机数种子产生的随机数是一样的,这就是伪随机数。

所以为使每次得到的随机数不一样,用函数srand()初始化随机数种子。 srand()的参数,用time函数值(表示当前的时间),因为每次调用rand()函数的时间是不同的,这样就可以保证随机性了。

代码示例:
在这里插入图片描述

rand的使用

任何一个数A取余(模)另外一个数B(都不为0), 即 A % B,区间的范围是: 0到 B-1。 生成 0-10 之间的随机数,rand % (10+1),区间范围是0-10。

如果需要产生1-10之间 的随机数,即rand %10,得到的区间范围是0-9, 所以 rand%10 + 1 得到 1- 10范围。

如果是生成 3-10,我们可以先得到0-7的范围,再+3。因为0-7的范围可以直接求得 rand %(10-3+1), 3-10范围即为 rand%8 + 3

四,去除重复随机数

再生成随机数的过程中,肯定会出现重复的数字,这个时候我们需要对随机数去重,所以我们可以定义一个数组,把生成的随机数一个个存起来,然后去除重复

如果数组的1 2 3 4 5,后面再得到一个随机数3,把前面所有的随机数逐次比较。
当i下标变成5的时候,j从0 开始遍历数组,范围是1-5中对比,
如果出现相同的数字直接跳出内部for循环,再次回到do{重新生成随机数},
也就是说i的下标还是5,跳出去之后, i肯定不会等于j,所以while中的判断条件是 i != j,
再次重新生成随机数,如果随机数不是3,是8,内部循环j不断++,直到变成最后判断结束,再+1次,j==i,跳出do while 循环,此时i就会自增了。
描述图:这里是引用

五,排序

排序可以使用冒泡排序,我这里使用的是排序函数qsort,qsort所需要的头文件是stdlib.h

qsort函数所需参数,这里我引用他人的文章>> qsort函数的使用 这里是引用最后再打印就得到了所需要的结果

通常情况下,我都会使用qsort来完成排序。

文章主要讲述如何生成任意范围内的随机数,并从中抽取特点的数值。
如果有任何的误解或者可改进之处,请不吝赐教。我将非常感激如何形式的反馈。我也将继续寻找学习和和改进的机会。

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值