椋鸟C语言笔记#10

随机数的生成

Featured image

萌新的学习笔记,写错了恳请斧正。

在 C 语言的 stdlib.h 头文件中,有一个能生成随机数的函数 rand()

rand 函数

rand 函数会返回一个在 0~RAND_MAX 之间的伪随机数

RAND_MAX 由编译器决定,一般为 32767(0x7ffff)

为什么说是伪随机数呢?

伪随机

伪随机数不是真的随机抽取的,而是由对应的种子计算生成的

当种子相同时,生成随机数就会相同:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    return 0;
}

以上方代码为例,如果在相同环境下反复运行,其输出结果保持不变

随机种子

随机种子由 srand 函数设置,其值要求为 unsigned int

用法如下:

srand(一个无符号短整型);
//无返回值

随机数通过随机种子生成

随机种子不同时,随机数才能随机

这不就矛盾了吗?我们需要随机数才能生成随机数?

时间函数

这时有一个解决方案,那就是用时间作为随机种子

因为时间肯定是一直在变的嘛!

我们如何在程序中引入时间呢?

可以使用时间函数 time(需要包含 time.h 头文件):

time_t time (time_t* timer); //这是时间函数的原型

时间函数的返回值类型为 time_t(32 或 64 位的整型)

当 time 函数的参数为 NULL 时,将返回当前的时间戳

时间戳:从 1970 年 1 月 1 日 0 时 0 分 0 秒到当前时间的秒数差值

如果参数不是 NULL 而是一个指针,函数也会将返回的差值放在 timer 所指向的内存中

设置随机种子

因此,如果要使用随机数,我们应该这么写:

srand((unsigned int)time(NULL)); //设置随机数种子
printf("%d\n", rand());

设置随机数种子建议放主函数开头

设置随机数范围

比方说要生成 0-99 间的随机数,我们可以:

rand() % 100

如果是 1-100 间:

rand() % 100 + 1

如果是 1-666 间:

rand() % 666 + 1

由此可以得到,在 a-b 间:

a + rand() % (b-a+1)

猜数字

这样我们可以写一个猜数字游戏:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>  //利用此头文件中的system函数可以实现清屏
 
void menu()
{
	printf("******************\n");
	printf("**1.guess-number**\n");
	printf("**0.exit-game   **\n");
	printf("******************\n");
}
 
void game()
{
	system("CLS");  //清屏
	int num = rand() % 100 + 1;
	int guess = 0;
	int cnt = 1;
 
	while(1)
	{
		printf("答案在1~100之间,请开始你的表演:\n");
		scanf("%d", &guess);
		
		if (num < guess)
		{
			system("CLS");
			printf("好大~\n");
		}
		else if (num > guess)
		{
			system("CLS");
			printf("行不行啊~细狗~\n");
		}
		else
		{
			system("CLS");
			printf("对喽~\n");
			break;
		}
 
		cnt++;
	}
 
	if (1 == cnt)
		printf("Ohhhhhhhhhhh\n一次猜中的欧皇!\n");
	else if (cnt <= 5)
		printf("666\n你用%d次就猜中了!\n", cnt);
	else if (cnt <= 10)
		printf("就这?就这?!\n你用了%d次才猜中\n", cnt);
	else
		printf("好好好,这么玩是吧?\n%d次猜中,太菜了\n", cnt);
 
 
}
 
int main()
{
	int cs = 0;
 
	srand((unsigned)time(NULL));
 
	do
	{
		menu();
		scanf("%d", &cs);
 
		switch (cs)
		{
		case 1: game(); break;
		case 0: break;
		default: system("CLS"); printf("你在瞎输什么?啊?\n");
		}
	} while (cs);
 
	return 0;
}