【与随机数有关的一些函数】

前言

以下总结均代表本人经过查阅文档后自行总结,若与事实有矛盾,请各位指出

1. rand函数


rand产生的随机数是通过一种算法生成的,而算法会产生一组随机数序列,这组随机数序列取决于srand函数,rand产生的随机数就是从随机数序列中的第一个开始产生的,也就是说,rand产生的随机数和srand函数有关

2. srand函数

后文将srand函数参数称作种子
在这里插入图片描述
读到这里我们应该清楚这几点
1. rand函数产生的随机数是从一个随机数序列开始的
2. 这个随机数序列取决于srand函数的种子
3. 若在任何到 srand() 的调用前使用 rand() ,则 rand() 表现为如同它被以 srand(1) 播种
4. 每次以同一 seed 播种 rand() 时,它必须产生相同的值数列
5. 想要每次产生不同的随机数序列我们的种子就应该是变量

3. time函数

在这里插入图片描述
对于time函数我们应该知道
1.返回值是时间戳,不同时刻调用time函数返回值不一样
2.time函数参数可以是NULL,返回值仍然是时间戳

我们可以将time,srand,rand函数连在一起使用为了产生随机数

正确用法

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
	srand((unsigned int)time(NULL));
	for (int i = 0; i < 10; i++)
	{
		int ret = rand();
		printf("%d\n", ret);
	}
	return 0 ;
}

在这里插入图片描述

注意事项

1. 调用rand函数前需要调用srand函数

在这里插入图片描述
在这里插入图片描述
因为没有调用srand函数,rand产生的随机数默认与srand(1)产生的随机数序列一一对应,而如果种子是一个常量,则随机数序列也会是固定的,不管程序运行几次,每次的随机数序列都和第一次一样

2. 不能频繁的调用srand函数

在这里插入图片描述
在程序运行开始运行时的时间戳与程序结束时的时间戳可以认为是一样的,因为程序不需要1秒就可以跑完,方便说明,记当前时间戳为A

第一次执行循环体,srand函数根据时间戳A得到了一个随机数序列,接着rand函数取这个序列的第一个数

第二次循环体,srand函数仍然会得到一个随机数序列,由于执行第二次循环体时的时间戳与第一次相同,所以产生的随机数序列也i相同,rand函数的到的随机数仍然是该序列的第一个数,所以和第一次的结果一样,以此类推
在这里插入图片描述
每次运行,让程序停下1s
记第一次执行循环体时间戳为A,第二次A+1,第三次A+2……

第一次根据时间戳A计算出来一个随机数序列,rand函数取第一个值
第二次根据时间戳A+1计算出另外一个随机数序列,rand函数取第一个值
但是第一次的时间戳和第二次的时间戳相差不大,所以最后算出来的随机数序列的第一个数相差也不大(具体的算法我不太清楚,所以不知道除了第一个以外后面的数相差是否大,能确定的只有第一个随机数相差不大)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值