Hello,各位!今天来通过一个小游戏引进一个知识点:生成随机数。下面进行介绍的所有概念都有对应的链接进行匹配,详细内容请点击链接进行观看。
生成随机数:
先来介绍一下随机函数rand():https://legacy.cplusplus.com/reference/cstdlib/rand/?kw=rand,返回值为0到RAND_MAX(32767)的一个伪随机数。在使用rand函数之前,要先使用srand函数,设置随机数的生成起点。(这句话可能有些小伙伴们不懂,但往下继续看。)
在来介绍一下srand()函数:https://legacy.cplusplus.com/reference/cstdlib/srand/?kw=srand,函数的参数为:伪随机数字的种子生成。
上述两个函数都有提到:伪随机数字,那么伪随机数字究竟是什么?下面来跟着小编来一起探索。
伪随机数字:
在计算机中不可能产生出完全随机的数,产生的是一个伪随机数。就比如,我们现在写一个程序要产生随机数,但理论上我们每一次去运行程序产生的随机数是一样的。代码如下:
int main() { int i = 0; while (i < 3) { int ret = rand(); printf("%d\n", ret); i++; } return 0; }
所以光用一个rand()函数不能产生一个随机数的,为了每一次进行调用的时候,返回值都不一样,所以就有了种子的概念。
种子:
(种子,不是bt的种子。)在前面的时候,已经介绍过了srand函数的参数是种子,作用是:使每次调用函数后,参数不同,从而使返回值都不一样。
下面来进行手撕代码:(我们要习惯于学习和适应手撕一些库函数,以至于我们能更好的地使用它们)
用C语言来实现rand()函数和srand()函数:
先来看rand()函数:这个next的数据可以随便进行乘除,我感觉无所谓。
static unsigned long int next = 1; //将数据放在静态区中 unsigned int randX() { next = next * 1103515245 + 12345; return (unsigned int)(next / 65536) % 32768; }
在来看srand()函数:
void srandX(unsigned int seed) { next = seed; }
讲完上述两个函数,接下来,进行讲述如何在电脑上真正地打印出随机数。在前面,我们每一次进行更换srand()函数的种子时,我们会发现生成的随机数再不断发生变化。而我们知道,一个变化的srand值可以对应不同的随机数值,而在电脑中,时间就是那个一直在变化的值。对于每个变化的时间,我们都有唯一的数字可以表示它,这个数字叫做时间戳。https://tool.lu/timestamp/
time函数:
简单介绍一下这个函数,详细内容在:https://legacy.cplusplus.com/reference/ctime/time/?kw=time,该函数可以返回一个时间戳(当前机器的时间与计算机起始时间的一个差值)。
time函数的参数是一个指针,如果你不想用的话,直接写成NULL即可。其返回类型为:time_t,所以在使用time函数时需要进行强制类型转换。
srand((unsigned int)time(NULL))
谢谢各位的观看,我们下一篇文章见,欢迎大佬进行批评和指正。