详解C语言-rand函数及猜数字小游戏

在利用C语言进行编程时,经常会遇到需要产生一个随机数。那么如何正确产生一个随机数呢?接下来我们将进行详细讨论,并给出随机数产生以及应用的一个实例。

1.rand函数

首先rand函数定义在 #include 中,使用时需要引用相应的头文件

// Maximum value that can be returned by the rand function:
#define RAND_MAX 0x7fff
通过头文件中的宏定义我们可以知道,rand 函数最大可以产生 0x7fff 的值,即其范围为0-32767。

2.rand函数的使用

int num1 = rand()%a;//a是一个整数,num的范围在0-a;
int num2 = rand()%10;//num2的范围在0-10;
int num3 = rand()%100;//num3的范围在0-100;
int num4 = rand()%(n-m+1) + m;//num4的范围在m-n
double num5 = (rand()%10/10.0);//产生小数随机数

3.随机数产生原理

我们通过以下的代码生成1个随机数:
#include 
#include 

int main()
{	
	int num = rand() % 10 + 1;//产生0-10的随机数
	printf("%d ",num);
	return 0;
}
我们发现每次运行程序时,随机数的结果相同,这是什么原因呢?
原来在 #include 中,在调用rand 函数之前,会检查是否先调用了srand(seed)来设置伪随机数生成器的种子。如果有调用过,将按照代码设置种子,即使用初始值初始化seed。如果没有调用srand(seed),系统会自动将seed 的值设为默认的初始值1,即自动调用srand(1)。如果每次调用rand函数时,种子相同,生成的伪随机数也会相同。
_ACRTIMP void __cdecl srand(_In_ unsigned int _Seed);
_Check_return_ _ACRTIMP int __cdecl rand(void);
由于上述代码每次运行时没有主动调用srand函数设置seed的值,所以每次都会默认调用srand(1),将seed的值设为1。因此产生的伪随机数不会发生变化。

4.srand的设置

那如何找到一个始终变化的值来初始化我们的srand函数呢?我们很容易想到时间,那么接下来我们开始慢慢完善吧!
我们首先获得时间:调用头文件 #include
static time_t time(time_t * const _Time)
再看srand的声明:
void srand( unsigned int seed );
time函数得到的值是一个时间戳,即从1970年1月1日0点到现在时间的秒数,然后将得到的time_t类型数据转化为(unsigned int)的数,再传给srand函数,因此我们可以写出这一句代码:
srand((unsigned int)time(NULL));
将这句代码写入标题 3 中的代码,我们可以获得始终变化的随机数,代码如下:
#include 
#include 
#include 
int main()
{
	srand((unsigned int)time(NULL));
	int num = rand() % 10 + 1;//产生0-10的随机数
	printf("%d ", num);
	return 0;
}

5.猜数字小游戏

最后,我们可以完成一个猜数字的小游戏,代码如下:
#include 
#include 
#include 

void menu()
{
	printf("******************\n");
	printf("** 1:>开始游戏  **\n");
	printf("** 0:>退出游戏  **\n");
	printf("******************\n");
}

void game()
{
	int m = 0;
	int ret = rand() % 99 + 1;
	while (1)
	{
		printf("请输入1-100之间的数字:");
		scanf("%d", &m);
		if (m < ret)
		{
			printf("猜小了\n");
		}
		else if (m > ret)
		{
			printf("猜大了\n");
		}
		else if (m == ret)
		{
			printf("恭喜你!猜对了\n");
			break;
		}
	}
}

int main() 
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do 
	{
		menu();
		scanf("%d",&input);
		switch (input)
		{
		case 0:
			printf("退出游戏:\n");
			break;
		case 1:
			game();
			break;
		default:
			printf("输入错误,请重新输入:\n");
			break;
		}
	} while (input);
	return 0;
}
如果使用的是vs编译器,对scanf报错,可将其换成scanf_s或者再代码开头加上:
#define _CRT_SECURE_NO_WARNINGS 1

你可能感兴趣的:(c语言,开发语言)