当前位置:   article > 正文

c语言生成随机数(rand、srand、time)_3. 利用c语言自带的随机函数(rand)产生一组随机数(不要超过10000),先将它们按

3. 利用c语言自带的随机函数(rand)产生一组随机数(不要超过10000),先将它们按

从无到有分析如何调用函数产生随机数

rand

在这里插入图片描述
在这里插入图片描述
如果只有一个rand,我们执行程序就会发现,每次执行时产生的随机值竟然是一样的,为什么会这样,这里我们就要了解一下rand函数的使用规则
在这里插入图片描述
言简意赅,就是需要先调用一次srand,才能保证每次执行程序的时候rand产生的是不同的随机值
(前一句话的意思是rand产生的随机数范围是0—RAND_MAX,而RAND_MAX指的是32767)
在这里插入图片描述


srand

我们先看srand函数的介绍,主要看框起来的参数部分以及那句话就好
函数返回值是void,不用管
参数是unsigned int类型的seed,这点要注意
这句话的意思是具有相同种子的两个不同初始化将在随后的rand调用中生成相同的结果序列。说人话就是如果传入的参数是常量,那两次运行的序列就是一样的,看下面的代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过更换参数值,我们可以发现,参数不同,生成的随机数确实是不同了,那么按道理我们需要传入一个不断改变的量才能产生不同的随机数,但是这就是先有鸡还是先有蛋的问题了,我们需要调用函数产生随机数,但是这个函数还需要我们传入随机数,这就是悖论了,因此针对这个问题,我们可以借助time函数。


time

这部分我们首先需要认识一下时间戳这个概念
时间戳:从1970年1月1日到现在(2023-6-29-09-50-53)这个时刻所经历的秒数,这个值会随着时间一秒一秒的流失而不断变大,正好符合srand需要传入一个变化的值的要求
在这里插入图片描述
那么,我们如果想要使用时间戳,那就要认识一下time函数了
这个函数就是可以获取指定时间对应的时间戳
参数timer存放的就是指定时间,如果是NULL空值,那传入的参数就是此时此刻的时间,而且是不断变化的
返回值是time_t类型的,实际上就是把long long类型重定义成time_t了
在这里插入图片描述
在这里插入图片描述
接下来,看进一步改进的代码
在这里插入图片描述
在这里插入图片描述
可以看到,两次运行的结果确实是不同了,但是每次的随机值比较接近,这也不太好,那接下来我们要进一步改进(ps:画框框的地方的强制类型转化不能少,因为在上面,我们看了,time返回值是time_t类型,但是srand的参数需要的是unsigned int类型的)
在这里插入图片描述
实际上,改进的方法就是把srand放到循环外头去。因为按照产生随机数的规则,srand只需要提供一次种子就可以了


完整代码

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main()
{
	int i = 0;
	int input = 0;
	srand((unsigned int)time(NULL));

	do
	{
		printf("输入1产生随机数,输入0不产生:\n");
		scanf("%d", &input);
		i = rand();
		printf("%d\n", i);
	} while (input);
	return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

对我的博客有问题欢迎大家在评论区留言,我看到会及时回复的!
谢谢大家支持!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/84115
推荐阅读
相关标签
  

闽ICP备14008679号