当前位置 博文首页 > 几叶只期的博客:玩猜字游戏顺便理解c语言的伪随机数(rand,sra

    几叶只期的博客:玩猜字游戏顺便理解c语言的伪随机数(rand,sra

    作者:[db:作者] 时间:2021-08-25 18:41

    随机数

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

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

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

    cs