分支与循环的应用:生成随机数、猜数字游戏

1.rand函数

C语言中提供了rand函数来生成伪随机数,并不是真正的随机数,真正的随机数是无法预测下一个值是多少的。rand函数是对⼀个叫“种子”的基准值进行运算⽣成随机数。,默认情况下,rand函数生成随机数时,种子为1。只要种子的值不变,rand函数生成的随机数就不会变化。
在这里插入图片描述
在这里插入图片描述

2.srand函数

2.1:srand通过参数seed来设置种子的值,只有它的参数seed发生变化,种子的值就会发生变化。

在这里插入图片描述

在这里插入图片描述

2.2:为什么在一个工程中,调用一次srand函数(将time函数的返回值作为它的参数)就可以多次使用rand函数生成随机数?

因为当srand函数运行一次后,种子的值就确定了(由当时的时间戳决定种子的值),生成的随机数序列就确定了。 比如生成的随机数序列50,10,745…,则第一次调用rand函数生成的随机数就是50,第二次调用生成的随机数就是745,第三次调用生成的随机数就是745。只有当下一次程序运行时(srand函数再次运行时),种子的值才会变化,生成的随机序列也就会发生变化。

3:time函数

3.1:时间戳

1970年1月1日0时0分0秒到当下时间之间经过的秒数就是时间戳。C语言中有⼀个函数叫 time ,用于返回时间戳。

3.2:想要获得真正的随机数,就需要每次程序运行时,srand的参数seed的值发生变化,从而使种子的值发生变化,那么如何使得每次程序运行时seed发生变化呢?C语言中通常是将时间戳传给srand函数。

在这里插入图片描述

4、生成真正的随机数

#include<stdlib.h>
#include<time.h>
#include<stdio.h>
int main()
{
	srand((unsigned int)time(NULL));
	//将time函数的返回值(时间戳)强制转换为unsigned int类型,将它作为srand函数的参数seed,
	//每一次程序运行时的时间戳都不一样,参数seed的值就会变化,导致每次程序运行后,rand函数生成的随机数不一样
	printf("%d\n", rand());
	return 0;
}

5.设置随机数的范围

在这里插入图片描述

6.实现猜数字游戏

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("****************************\n");
	printf("*******输入1:开始游戏*******\n");
	printf("*******输入0:结束游戏*******\n");
	printf("****************************\n");
}

void game()
{
	//1.生成随机数
	int r = rand() % 100 + 1;
	//2.猜数字
	int guess = 0, count = 5;
	while (count)
	{
		printf("还有%d次机会,请猜数字:", count);
		scanf("%d", &guess);
		if (guess > r)
			printf("猜大了\n");
		else if (guess < r)
			printf("猜小了\n");
		else
		{
			//直到猜对了才能退出循环,否则就不停的猜下去
			printf("恭喜你,猜对了\n");
			break;
		}
		count--;
	}
	if (count == 0)
		printf("所有的机会用完了,游戏失败,正确的数字是%d\n",r);
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	//srand函数在整个工程中只需要调用一次即可,即种子只需要设置一次
	do
	{
		menu();
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入的数据有误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值