600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 【从饮水机到名人堂之c语言】详解rand()函数(详解随机数生成方法)

【从饮水机到名人堂之c语言】详解rand()函数(详解随机数生成方法)

时间:2021-12-01 04:31:42

相关推荐

【从饮水机到名人堂之c语言】详解rand()函数(详解随机数生成方法)

目录

前言

一、rand()函数

二、srand()函数

三、时间戳

四、time()函数

五、注意

六、猜大小游戏源码

总结

前言

在我们的日常写程序中,必然会用到我们的rand函数生成我们的随机数,例如我们在猜数字游戏中,先得生成一个随机数,才能让玩家去猜,今天我就来给大家讲解一下随机数生成的详细原理。

一、rand()函数

rand()函数在C语言中是这么定义的,它需要包含<stdlib.h>头文件,他的功能是生成一个在0到32767之间的随机数,那么为什么是32767呢?我们先来探究一下。

我们在对rand()函数转到定义之后,发现rand函数的最大值RAND_MAX定义为#define RAND_MAX 0x7fff ,而这块的0x7fff使我们十六进制的数字,如果转为二进制的话,他的大小就是32767。如果我们不会进制转换,也可以通过电脑自带的计算器来计算。

接下来,我们就来通过程序来看看是否可以生成随机数。

我们会发现我们两次生成的随机数是相同的,这肯定不符合我们对随机数的要求了,究竟是哪里出了问题呢?我们再来看看对rand函数的定义,原来是要调用另外一个函数srand函数。

二、srand()函数

伪随机数生成器使用作为 传递的参数进行初始化。

对于调用中使用的每个不同值,伪随机数生成器可以预期在随后的调用中生成不同的连续结果。

具有相同值的两个不同初始化将在后续调用中生成相同的连续结果

这也就是说,我们必须给srand函数传入一个随机变化的整形参数,然后才能获得随机数,但是我们怎么可能先输入一个随机数再获得一个呢,这就是有问题啊,我们怎么解决呢?这个时候我们就得引入一个时间戳的概念了。我们的时间是随时变化的,我们可以通过转换转换成我们的时间戳来给srand函数输入一个参数,这样就可以解决了。

三、时间戳

通过介绍,我们可以清楚地看到时间戳是根据1970年1月1日2时到现在的秒数来获取的,我们的时间在一直变化,所以我们的时间戳是一个变化的整数。然后我们将我们获取的时间戳作为参数传入srand函数,就可以获得一个随机数。但是为了获取时间戳,又必须使用另外一个函数time()

四、time()函数

time_t time (time_t* timer);

这是对于time函数的定义,可以看到他的参数是time_t *,它是一个指针变量,就是是一个地址,那他存储的是谁的地址呢,原来它存储的就是获取的时间戳,如果我们想要将获得的时间戳存储起来,我们就可以使用指针将它存储起来,但是我们在这里不需要存储,所以我们就给一个空指针NULL,而且time函数的返回值也是现在的时间戳,我们就可以利用time函数返回值获取时间戳。

我们不是说时间戳是一个整型吗?但是为什么他的数据类型时time_t 呢,我们再去探究一下。

我们寻根究底,最终发现原来time_t类型在32位环境下就是一个long类型的,它是一个长整型,只不过用typedef关键词重命名了,这下就符合我们前边的观点了,可以为srand函数提供一个变化的整数,但是我们srand函数的参数需要一个无符号的整型,我们只需要一个强制类型转换的好了。

我们也要记得在使用time函数的时候引用<time.h>头函数。

五、注意

这时,我们也要知道srand函数应该放在主函数里,而不是放在我们定义函数里,我们只需要提供一次起点就可以了,如果每次都定义,因为时间相近,所以我们获得的时间戳相近甚至相同。

我们在获取随机数时,rand函数会获得0到32767的随机数,可是我们日常不需要这么大的随机数,我们可以通过给获取的数字取模来获得小的随机数,例如当我们需要一个100以内的随机数时,我们就用获得的随机数%101,这个时候获得的数字肯定小于100。

六、猜大小游戏源码

#include <stdio.h>#include <stdlib.h>#include <time.h>void menu(){printf("**********************************\n");printf("*********** 1.play **********\n");printf("*********** 0.exit **********\n");printf("**********************************\n");}//RAND_MAX--rand函数能返回随机数的最大值。void game(){int random_num = rand() % 100 + 1;int input = 0;while (1){printf("请输入猜的数字>:");scanf("%d", &input);if (input > random_num){printf("猜大了\n");}else if (input < random_num){printf("猜小了\n");}else{printf("恭喜你,猜对了\n");break;}}}int main(){int input = 0;srand((unsigned)time(NULL));do{menu();printf("请选择>:");scanf("%d", &input);switch (input){case 1:game();break;case 0:break;default:printf("选择错误,请重新输入!\n");break;}} while (input);return 0;}

总结

我们今天主要通过猜数字的游戏来引出获取随机数的方法,详细讲解rand函数使用方法,希望对大家有所帮助。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。