rand()函数:
基于一个种子生成0-RAND_MAX之间的随机数
默认的种子为1
使用该函数需要包含cstdlib文件
需要注意的是
rand()生成的是伪随机数
简单来说它并不是真正的随机数
而是根据一定的算法生成的数值序列
学术界规定,凡是用一定的算法使程序生成的数都是伪随机数
通过物理现象产生的随机数才是真随机数
两者的区别是
算法生成的随机数是可预测的
而物理生成的随机数无法预测
使用算法生成随机数比如rand()函数等
物理生成随机数比如抛硬币,掷骰子等
如果每次调用rand()的时候使用相同的种子,结果也将会是相同的,这便可以预测
如果可以提前预知种子,也便可以预测
也许我们生存的所谓的真实世界也不过是由一个种子生成的,接下来所发生的一切都是可预测的,只是目前还没有人类发现预测的方法,当然也这不是我们该研究的
而我们现在要研究的是如何使用rand()函数生成伪随机数
既然rand()函数依赖种子来运作,那么我们只要找到一个永不重复的种子不就便可以生成伪随机数了吗
而解决随机种子最好的办法便是时间戳
简单介绍一下时间戳:
时间戳通常指一种表示日期和时间的数字形式
而最常见的时间戳是Unix时间戳
它起始于1970年1月1日0点(北京时间1970年1月1日8点)也被称为纪元时间
如时间戳”1678802051”它的意义便是从北京时间1970年1月1日0点至今经过的秒数
(如果你的时区在北京时间那么你的起始时间为1970年1月1日8点)
因为时间戳每秒都时不同的数字
所以我们使用时间戳作为rand()的种子比较合适
time()函数
将NULL传入time()函数将返回当前系统的时间的时间戳
也就是1970年1月1日0点以来经过的秒数
(如果你的时区在北京时间那么你的起始时间为1970年1月1日8点)
使用该函数需要包含ctime文件
srand()函数
用于设置随机数生成器的种子
种子必须为整形
使用该函数需要包含stdlib.h文件
将time(NULL)作为srand()参数后再次调用rand()函数便可实现伪随机数
使用公式rand()%(Max+1-Min)+Min获取指定范围的随机数
如获取30-40之间的随机数
套用公式:rand()%(40+1-30)+30即可
如有对本文有不清楚之处请留言
如有不足之处敬请批评指正