随机数
要想要产生真正的随机数,需要先来了解下面几个函数。
- rand()函数
C 库函数 int rand(void) 返回一个范围在 0 到 RAND_MAX 之间的伪随机数。
RAND_MAX 是一个常量,它的默认值在不同的实现中会有所不同,但是值至少是 32767。
- srand()函数
C 库函数 void srand(unsigned int seed) 播种由函数 rand 使用的随机数发生器。
seed --这是一个无符号整型值,用于伪随机数生成算法播种。
这里有一个新的概念,也就是“种子”,我们可以简单的理解为产生随机数的起点。
伪随机数生成器会以种子作为起点,产生上述范围内的伪随机数,如果没有设置种子的话,系统会默认seed为1,那么就会产生这样的后果:产生的数是随机的,但每次运行程序,得到的结果都还是上次的随机值,因为随机数产生的起点没变,伪随机数生成器还是按照原来方式进行周期的取值,而这就不是我们所期望的结果。
那么用什么作为种子,让这个起点不断变化呢?时间,就是一个很好的选择!于是我们会用到一个概念——时间戳。
- time()函数
C 库函数 time_t time(time_t *seconds) 返回自纪元 Epoch(1970-01-01 00:00:00UTC)起经过的时间,以秒为单位。如果 seconds 不为空,则返回值也存储在变量 seconds 中。
time_t这是一个适合存储日历时间类型,如果要作为种子,需要强制类型转换为无符号整型。
time(NULL)将返回计算机目前的时刻与1970年1月1日0时0分0秒之间的时间差,单位是秒。
理解了上述函数之后,再产生随机数就简单多了。
先利用动态的时间去设置一个随机种子:
srand((unsigned int)time(NULL));
因为时间戳返回的数值比较大,我们可以取余得到想要的范围,例如我想要的范围是1~100,可以这样做:
num = rand()%100;
猜字游戏
好了,知道如何产生随机数以后,我们利用这个随机数来写一个很简单的猜字游戏吧。
#include <stdio.h>
#include <stdlib.h>//rand()和srand()函数的库
#include <time.h> //time()函数的库
int main()
{
srand((unsigned int)time(NULL));//产生一个动态的随机种子
int input = 0;
int num = 0;
num = rand() % 100;
printf("猜猜我心里想的数,在1~100之间选择:\n");
while ((scanf("%d", &input)) != EOF)
{
if (input > num)
{
printf("你的数猜大了,再试试看。\n");
}
else if (input <num)
{
printf("你的数猜小了,再试试看。\n");
}
else
{
printf("恭喜你猜对了,真是天才啊!\n");
}
}
return 0;
}
程序运行后