赞
踩
如果只有一个rand,我们执行程序就会发现,每次执行时产生的随机值竟然是一样的,为什么会这样,这里我们就要了解一下rand函数的使用规则
言简意赅,就是需要先调用一次srand,才能保证每次执行程序的时候rand产生的是不同的随机值
(前一句话的意思是rand产生的随机数范围是0—RAND_MAX,而RAND_MAX指的是32767)
我们先看srand函数的介绍,主要看框起来的参数部分以及那句话就好
函数返回值是void,不用管
参数是unsigned int类型的seed,这点要注意
这句话的意思是具有相同种子的两个不同初始化将在随后的rand调用中生成相同的结果序列。说人话就是如果传入的参数是常量,那两次运行的序列就是一样的,看下面的代码
通过更换参数值,我们可以发现,参数不同,生成的随机数确实是不同了,那么按道理我们需要传入一个不断改变的量才能产生不同的随机数,但是这就是先有鸡还是先有蛋的问题了,我们需要调用函数产生随机数,但是这个函数还需要我们传入随机数,这就是悖论了,因此针对这个问题,我们可以借助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; }
对我的博客有问题欢迎大家在评论区留言,我看到会及时回复的!
谢谢大家支持!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。