玩猜字游戏顺便理解c语言的伪随机数(rand,srand)

随机数

要想要产生真正的随机数,需要先来了解下面几个函数。

  • 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;
}

程序运行后
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42907822/article/details/114647616
今日推荐