我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++游戏教程基本技巧之随机化详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++游戏教程基本技巧之随机化详解

0. 引言

小游戏中时常要用到随机数,今天就来谈谈这个所谓的“随机”。

1. 随机数 rand()

我们要使用随机数(严格意义上是伪随机)的话,C++ 中就有 rand() 来提供了这一操作。

rand()返回值是整数。在不同系统的编译器下,返回值的范围不同,我们姑且认为足够我们使用。

设我们要获取数x,逐步推导:

当x∈[0,100] 时,可以写成 rand()%101;

当 x∈[1,100] 时,可以转化为x′+1(x′∈[0,99]),写成 rand()%100+1;

当x∈[l,r] 时,可以转化为x′+l(x′∈[0,r−l]),写成 rand()%(r-l+1)+l。

可现实总是不尽如人意:

为什么每次随机出来的序列都是一样的呢?这里我们就要讲到下面的东西了

2. 设置随机种子 srand()

毕竟是伪随机,所以每次生成的随机序列需要有一个初始的随机种子(无符号整数),srand() 提供了这一操作。

比如设置随机种子为114514,可以写成 srand(114514);

然而

这意味着种子要随机。

3. 时间 time()

time() 返回从 1970.1.1 1970.1.1 1970.1.1 至今的秒数,参数直接填 NULL 或 0 0 0(也就是空指针)即可。

设置为种子,也就是 srand(time(0));

效果显著:

4. 随机排列 random_shuffle()

如果有一个数组 a a a,如何让其进行随机排列呢?

C++ 有函数 random_shuffle()

参数和用法与 sort() 类似,直接调用即可。

示例代码:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	srand(time(0)); 
	int n,a[105];
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	random_shuffle(a+1,a+n+1);
	for(int i=1;i<=n;i++)
	{
		cout<<a[i]<<' '; 
	}
 	return 0;
}

效果:

5. 随机基本案例

5-1. 随机 01 矩阵

给定边长n,要求生成一个随机 01 矩阵。

示例代码:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	srand(time(0)); 
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout<<rand()%2;
		}
		cout<<endl;
	}
 	return 0;
}

效果:

5-2. 随机区间

给定n,要求生成n个区间[l,r](l≤r),并且这些区间是[1,n]的子区间。

每次分别对于l,r随机,然后调整l,r大小位置。

示例代码:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	srand(time(0)); 
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int l=rand()%n+1,r=rand()%n+1;
		if(l>r) swap(l,r);//防止 l>r
		cout<<l<<' '<<r<<endl;
	}
 	return 0;
}

效果:

5-3. 随机浮点数

给定n和k,要求生成n个[0,n] 的k位浮点数(不可以有后缀0)。

分成整数部分和小数部分考虑。

整数部分生成[0,n] 的整数,小数部分生成k位 [0,9] 的数(在位数允许时,可以生成一个[0,10k−1] 的整数代替小数)。

当然,要特判整数为n的情况。若小数部分>0,就不在[0,n]内了。

处理后缀0时,只要把其存进字符串处理即可。

示例代码:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	srand(time(0)); 
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		int d=rand()%(n+1);
		cout<<d;
		if(d==n)
		{
			cout<<endl;
			continue;
		}
		string s=".";
		for(int j=1;j<=k;j++)
		{
			s+=(char)(rand()%10+48);
		}
		while(s[s.size()-1]=='0'&&s.size()>2) s.erase(s.size()-1);//防止后缀 0
		cout<<s<<endl;
	}
 	return 0;
}

效果:

5-4. 随机整数

给定n,l,r(l,r∈Z,l≤r),要求生成n个整数x(x∈[l,r])。

可能含有负数,该怎么办呢?

分三类讨论:

1.当l≤r≤0 时,先输出 -,然后生成[∣r∣,∣l∣] 范围的整数。

2.当l≤0≤r 时,先随机t=0或1来确定符号。

  • 当t=0时,输出 -,生成[0,∣l∣] 的整数。
  • 当t=1时,生成[0,r]的整数。

3.当0≤l≤r时,直接生成[l,r] 的整数。

注意以上操作中输出 -0 的情况要处理一下。

示例代码:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	srand(time(0)); 
	int n,l,r;
	cin>>n>>l>>r;
	while(n--)
	{
		if(l<=r&&r<=0)
		{
			int d=rand()%(abs(l)-abs(r)+1)+abs(r);
			if(d) cout<<'-';//防止 -0
			cout<<d;
		}
		else if(l<=0&&0<=r)
		{
			int f=rand()%2;
			if(f) cout<<rand()%(r+1);
			else
			{
				int d=rand()%(abs(l)+1);
				if(d) cout<<'-';//防止 -0
				cout<<d;
			}
		}
		else cout<<rand()%(r-l+1)+l;
		puts(""); 
	}
 	return 0;
}

效果:

以上就是C++游戏教程基本技巧之随机化详解的详细内容,更多关于C++随机的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++游戏教程基本技巧之随机化详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++游戏教程基本技巧之随机化详解

在小游戏的制作中时常常会要用到随机数,这篇文章就来和大家谈谈C++中这个所谓的“随机”。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录