c语言生成随机数(rand、srand、time)

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

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;
}


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

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值