椋鸟C语言笔记#10:随机数的生成

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


 

目录

rand函数

伪随机

随机种子

时间函数

设置随机种子

设置随机数范围

猜数字


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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椋鸟Starling

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值