你知道如何生成随机数吗?(超详细附图)

你知道如何生成随机数吗?(超详细附图)手把手教你得到计算机的随机数,并附上一个小栗子。内有大良图片与代码实例

 

目录

😉前言

🍸如何用C语言实现随机数

🍹随机数原理

🍹rand函数(生成随机数)

🍹srand(避免每次运行程序产生的随机数都相同)

🍹时间戳

🥤time函数

🍸来个小小项目

🍸代码实现

🍹1.漂亮的主页

🍹2.游戏开关

🍹3.game()函数的代码实现。

🍹4.完整代码


 

手把手教你得到计算机的随机数,并附上一个小栗子。

 


 

😉前言

这两天时间允许还是日更叭,落下了不少博客没写呢,元气满满的一天,加油!多谢大家的支持,我已经500粉啦!

f33f27e3dfe04c86a55e4f0039b56bfb.gif

🍸如何用C语言实现随机数

🍹随机数原理

 计算机所产生的随机数是通过一串很长的序列数模拟随机数,故称为伪随机数,在实际应用这些随机数时,这些随机数一般都能具有真实随机数的所有概率性质和统计性质,因此可以产生许许多多的序列伪随机数,一个序列的第一个随机数对应一个数,这个数称为种子数(seed)。

 简单的说,计算机随机数是通过一个算法(我也不知道)在一串已经定下来的数据中生成,每次生成随机数的起点叫做“种子数”。这个了解一下就行。

🍹rand函数(生成随机数)

在获取随机数的时候我们需要用到rand函数,拿出我们祖传的网站:http://cplusplus.com/ 来了解这rand函数。

这是一个针对函数资料查找的一个网站,在搜索栏写入你想查看的函数就可以的出结果。界面是全英文,在刚开始我们可以用百度翻译来帮助我们,看多了你就会发现,凭自己的能力也能看的懂了。不推荐使用整页翻译,这样会把int,rand,void等等关键词翻译掉,反而不利于我们理解。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

我们来一点一点理解(其实我也是用了百度翻译)。 

 

b9b888ae379543cda91c247cfb016dfc.png

可以得出,我们无需传数据进去,且它会返回一个整数。

 d05bb7067a50421e80ce3856a8cf9cd3.png

 并且它返回的是一个0到RAND_MAX间的数字。而RAND_MAX的值具体是多大,我们可以医用编译器来看看。和RAND_MAX一样,调用rand也需要声明stdlib头文件。

fbd9f74f6cf34d0d9d8d6e20c2721d39.png

 十六进制0x7fff换算成十进制就是32767。函数给我们的返回值就是0~32767这范围的一个随机数。

通过代码简单试一试,rand函数的效果。

第一次:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_16,color_FFFFFF,t_70,g_se,x_16

 但当我们运行第二次的时候,我们会发现,他返回的数字一模一样。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

如果要求不是很高的话,这样子使用rand函数已经够了。但有一说一,这其实并不是真正的随机数。包括你重启电脑再去运行的话它还是会返回一模一样的结果,因为我们的种子数没有改变。

🍹srand(避免每次运行程序产生的随机数都相同)

   srand()用于初始化rand()使用的随机数种子

cdd368d82dde467fa4438fc774d2885e.png

 我们在代码中加上srand试一试

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 换一个种子数试试:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_18,color_FFFFFF,t_70,g_se,x_16

 我们可以看出,随着种子数的不同系统产生的随机数也是不同的。如果我的种子数是时刻改变的,那我这个程序不是就可以每时每刻都生成不同的数字了。这取决于种子数在每时每刻都不一样,什么样的东西满足我们这个要求呢——时间

🍹时间戳

简单的说,时间戳就是随时间改变而改变的一个整数。比如下面两个例子:

 189ca47dcb9c47bc8a6b4976e8b24ecd.png

 

1c8909d91e314656ba7cbe0564205bd8.png

 每时每刻都生成不同的数字。要想实现这个目的,只需要将时间戳放入rand函数里去。这里可以用time函数来实现

🥤time函数

 ef5984f11d6d48a485c9d02fb19ccc69.png

 从这个图可得,使用这个函数需要传入一个指针变量,它会返回一个time_t类型的元素,这个元素也是随时间戳改变而改变的。

 PS:time函数需要调用time.h头文件。

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 我们可以看到,两次使用这个程序,它给我们带来的数字是完全不一样的。这样就实现了随机数的取值。

 

 

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 

🍸来个小小项目

这次我们来学习一个小项目的制作,猜数字,规则如下:

在1~100的范围内猜数字n(假如是80),我第一次猜50,被提示小了;第二次猜75,提示小了;第三次猜87,提示大了;第四次猜80,猜对了。

项目思路:

  1. 需要猜测的数字范围是1~100.
  2. 可以重复游玩。
  3. 每次玩的时候数字都要不同。

这个游戏思路不难,而且我们刚好可以联系一下随机数这个概念。一起来吧。

🍸代码实现

🍹1.漂亮的主页

在制作一个游戏时,我们需要一个漂亮的主页,我们把它集成到一个函数中实现。

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

实现效果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 

🍹2.游戏开关

接下来我们需要一个实现一个控制游戏开关的代码段。为了我建议用到do while循环,因为它的特点就是:不管三七二十一,先循环一遍。这里我们的程序至少要循环一遍,看看玩家是否继续游戏。

int main()
{
	int op=0;
	do
	{
		menu();
		printf("请输入你的选项:");
		scanf("%d",&op);
		switch (op)
		{
		case 1:printf("开始游戏\n");
			break;
		case 0:printf("退出游戏");
			break;
		default:printf("输入错误,请再次输入\n");
			break;
		}
	} while (op);
	
	return 0;
}

这就是运行效果,嗯嗯🧐达到我们的预期了。 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 这里有一个小细节,有些小伙伴可能已经注意到了。每写一部分,我就会测试一部分,这是一个编程的小技巧,这样可以有效避免bug的累加,因为bug累计多了,到最后测试的时候你会发现无从下手。

不过这样子也能让博客讲的更清楚,真好🐱‍💻。

接下来进行主要部分的书写。

🍹3.game()函数的代码实现。

void game()
{
	int ret=rand()%100+1;//实现程序取得的随机数值为1~100
	int guess=0;
	do 
	{
		scanf("%d", &guess);
		if (guess < ret)
			printf("猜小了\n");
		else if (guess > ret)
			printf("猜大了\n");
		else
		{
			printf("猜对了\n");
			break;
		}
	} while (1);//猜对了才能退出
	return;
}

第三行这里给程序产生的随机数取mod了,目的在于实现取得的随机数在1~100的范围之内。

同理,如果你想取50~100,可以这样写:

ret = rand () % 50 + 51;

🍹4.完整代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("**********************\n");
	printf("***** 1.开始游戏  ****\n");
	printf("***** 0.退出游戏  ****\n");
	printf("**********************\n");
}
void game()
{
	int ret=rand()%100+1;
	int guess=0;
	do 
	{
		scanf("%d", &guess);
		if (guess < ret)
			printf("猜小了\n");
		else if (guess > ret)
			printf("猜大了\n");
		else
		{
			printf("猜对了\n");
			break;
		}
	} while (1);//猜对了才能退出
	return;
}
int main()
{
	srand((unsigned int)time(NULL));
	int op=0;
	do
	{
		menu();
		printf("请输入你的选项:");
		scanf("%d",&op);
		switch (op)
		{
		case 1:printf("开始游戏\n");
			game();
			break;
		case 0:printf("退出游戏");
			break;
		default:printf("输入错误,请再次输入\n");
			break;
		}
	} while (op);
	
	return 0;
}

一个小细节,因为srand函数实质上是对种子数的初始化,我们习惯性将它放在主函数来初始化,而且一个工程只需要定义一次就行了。

到这里这篇文章就算结束了

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

 

 尼尔叔叔:你自己去试试看吧。

 

有个思路很类似的文章二分查找法

也可以学习一下。

 

 

 

 

 

今天的文章你知道如何生成随机数吗?(超详细附图)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/8583.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注