【Godot4.2】随机数入门指南

概述

计算机程序是精确的艺术,现实生活却充满了随机性。如果你的游戏缺乏了随机性,也就缺乏了最基础的乐趣。

我们在很多场景下需要使用随机数,来为已经非常刻意和规整的设计带来一些变化和趣味。

比如打怪、打完Boss或开宝箱后随机掉落不同的物品,随机生成地图,判定某次攻击的命中率等等。

要想成为游戏设计高手,随机数的学习和使用是躲不开的命题。

本篇讲解Godot内置脚本GDScript提供的随机数生成类和方法,带你进入游戏设计随机数的大门。

真随机数和伪随机数

基本定义

在这之前需要先明白一点:随机数都是由随机数生成器(Random Number Generator)生成的。

真随机数(TRUE Random Number)

真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等,这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。 ----百度百科

伪随机数(Pseudo-Random Number)

真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。

而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的。我们可以这样认为这个可预见的结果其出现的概率是100%。所以用计算机随机函数所产生的“随机数”并不随机,是伪随机数。

从定义我们可以了解到,伪随机数其实是有规律的。只不过这个规律周期比较长,但还是可以预测的。主要原因就是伪随机数是计算机使用算法模拟出来的,这个过程并不涉及到物理过程,所以自然不可能具有真随机数的特性。

在GDScript中使用随机数

GDScript提供了一个名叫RandomNumberGenerator的类用于生成随机数,直译过来就是“随机数生成器”。下图是它的一个简要总结图。
在这里插入图片描述

extends Node2Dvar rng = RandomNumberGenerator.new()func _ready():rng.randomize()    # 为RNG设置基于时间的种子print(rng.randi()) # 生成整数pass

以上的代码生成的是一个比较大的随机整数。

  • randi()中的i就是int或者integer,也就是“整数”意思。
  • 你可以看到还有一个函数randf(),它的f,就是float,“浮点数”的意思。

这样理解和记忆起来就不会费劲了。

randi()

值得注意的是,randi()只会生成无符号整数,也就是始终返回一个正整数。

因为它返回的数比较大,所以要限定其范围获得一个比较小的数,就需要用运算符%,后面跟一个整数。这是一种特定的写法:

rng.randi()            # 返回 02^32 - 1 之间的随机整数
rng.randi() % 20       # 返回019之间的随机整数
rng.randi() % 20 + 1   # 返回120之间的随机整数
rng.randi() % 100      # 返回099之间的随机整数
rng.randi() % 100 + 1  # 返回1100之间的随机整数

randf()

randf()返回的是0.01.0之间的小数,print出来的是带六位小数的浮点数。

如果想要获得一个大一点的数,就需要在randf()之上乘以一个整数。

rng.randf() * 10 # 返回0-10之间的浮点数

randi_range()和randf_range()

很多时候我们只需要一个小范围内的随机数。可以使用带_range后缀的两个方法来限定范围。

rng.randi_range(1,10)
rng.randi_range(-10,10)
rng.randf_range(1.0,10.0)
rng.randf_range(-10.0,10.0)

randomize()的作用

  • RandomNumberGenerator生成伪随机数是靠“随机数种子”。
  • randomize()的作用是生成一个基于时间的随机数种子,只要这个随机数种子发生了变化,用其方法生成的伪随机数才会发生变化,否则,返回的还是之前的随机数数列。

随机数生成器的状态

RandomNumberGeneratorstate属性是一个整数值,保存了它的状态,有点像随机数种子,只要我们记录和恢复了它,也就意为着可以还原整个随机数生成器的状态,生成一模一样的随机数数列。

var rng = RandomNumberGenerator.new()
print(rng.randf())
var saved_state = rng.state    # 存储当前状态。
print(rng.randf())             # 提前进入内部状态。
rng.state = saved_state        # 存储状态
print(rng.randf())             # 打印与上一次相同的值。

@GDScript内置的相关随机数生成函数

GDScript内置函数里,有几个和RandomNumberGenerator方法近乎一致的一些方法,我们可以直接拿来使用。
在这里插入图片描述

参考

  • CSDN博主「绘夜」,《随机数:真随机数和伪随机数》
  • 百度百科
  • Godot相关API的内置文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/759466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在MongoDB建模1对N关系的基本方法

“我在 SQL 和规范化数据库方面拥有丰富的经验,但我只是 MongoDB 的初学者。如何建立一对 N 关系模型?” 这是我从参加 MongoDB 分享日活动的用户那里得到的最常见问题之一。 我对这个问题没有简短的答案,因为方法不只有一种,还有…

软件系统开发设计的基本流程

一、前言 经过年的工程实践软件系统开发的流程演变有很多种,但是最基本的还是瀑布模型。但是由于近几年演变了很多种模型,现在很多公司的研发流程并不遵循瀑布模型。主要原因是无法满足市场竞争的需求。比如在哪某个节日需要敏捷上线活动等这样的场景。没…

ASP .Net Core 配置集合 IConfiguration 的使用

🐳简介 IConfiguration 是 ASP.NET Core 中的一个接口,用于表示配置集合。以下是关于 IConfiguration 的详细介绍: 作用:IConfiguration 允许开发人员从各种来源(如文件、环境变量、命令行参数等)读取应用…

inner join,left join,right join,outer join的区别

INNER JOIN:内连接是最常见的连接操作,它返回两个表中满足连接条件的交集。即只返回条件匹配的记录。 LEFT JOIN:左连接返回左表记录和右表记录匹配后组成的记录。以及左表中未与右表匹配的记录,右边用null显示。 RIGHT JOIN&…

好就业三种专业#信息安全#云计算#网络工程

一、信息安全专业 根据2021年网络安全宣传周白皮书的观察结果,网络安全产业对于人才的需求正以高速增长的趋势呈现,当前网络安全行业存在着巨大的人才缺口,平均供求比例约为1:2。这一现象导致了资深人才的储备不足,并且新人才的培…

如何画好架构图

什么是架构图? 架构图 架构的表达 架构在不同抽象角度和不同抽象层次的表达 架构可以从很多个角度去看,比如:业务架构、应用架构、技术架构、代码架构、数据架构等。 从架构级别来分类,使用金字塔的说明,上层级别…

图像分割论文阅读:Adaptive Context Selection for Polyp Segmentation

这篇论文的主要内容是关于一种用于息肉分割的自适应上下文选择网络(Adaptive Context Selection Network,简称ACSNet) 1,模型的整体结构 模型的整体结构基于编码器-解码器框架,并且包含了三个关键模块:局部…

贵州省二级分类土地利用数据(矢量)

贵州省,地处中国西南腹地,地貌属于中国西南部高原山地,境内地势西高东低,自中部向北、东、南三面倾斜,平均海拔在1100米左右。贵州高原山地居多,素有“八山一水一分田”之说。全省地貌可概括分为&#xff1…

【鸿蒙HarmonyOS开发笔记】通知模块之为通知添加行为意图

概述 WantAgent提供了封装行为意图的能力,这里所说的行为意图主要是指拉起指定的应用组件及发布公共事件等能力。HarmonyOS支持以通知的形式,将WantAgent从发布方传递至接收方,从而在接收方触发WantAgent中指定的意图。例如,在通…

RK3568平台开发系列讲解(pinctrl篇)引脚的复用关系的设置

🚀返回专栏总目录 文章目录 一、调用pinctrl_bind_pins二、dev_pin_info结构体沉淀、分享、成长,让自己和他人都能有所收获!😄 引脚的复用关系是在什么时候被设置的。 一、调用pinctrl_bind_pins 在内核源码目录下的 “drivers/base/dd.c” 文件中 static int really_p…

Java项目:67 ssm家政服务网站设计+jsp

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 家政服务网站,主要的模块包括查看 管理员;个人中心、用户管理、服务类型管理、家政类型管理、家政评价管理、家政资讯…

Cesium for UE-01-虚幻引擎的下载安装及插件配置

学习Cesium for UE的过程笔记 下载UE 下载 下载完成后,点击运行,执行安装 安装完成后需要下载epic game 下载完成,需要登录 没有账号的自行注册,或者选一个有账号的平台登录即可 选择虚幻引擎,再点击库 可以看到下…

课时70:流程控制_for循环_嵌套循环

2.4.4 嵌套循环 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 这里的嵌套实践,与选择语句的嵌套实践基本一致,只不过组合的方式发生了一些变化。常见的组合样式如下:for嵌套for语句for …

【工具使用】VScode配置gcc开发环境

一,简介 本文主要介绍如何在VScode中配置gcc环境,方便开发调试。 二,配置步骤 2.1 gcc环境配置 2.1.1 安装gcc环境 这里我使用的是msys2,具体安装步骤可以参考我另外一篇文章《史上最全msys2下载配置操作步骤》,这…

SpringCloud-Feign远程调用

使用Feign替代RestTemplate进行远程服务调用&#xff1a; 远程调用配置 1. 引入依赖 我们在order-service服务的pom文件中引入feign的依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starte…

计算机三级——网络技术(综合题第二题)

路由器工作模式 用户模式 当通过Console或Telnet方式登录到路由器时&#xff0c;只要输入的密码正确&#xff0c;路由器就直接进入了用户模式。在该模式下&#xff0c;系统提示符为一个尖括号(>)。如果用户以前为路由器输入过名称&#xff0c;则该名称将会显示在尖指号的前…

idea2022中修改护眼主题色和注释颜色

背景&#xff1a;重装了2022版本idea&#xff0c;想改idea的颜色 背景修改 效果如下。护眼模式好了 修改注释

Kafka生产者相关概念

文章目录 Kafka工作流程Kafka文件存储生产者分区策略生产者ISR生产者ack机制数据一致性问题ExactlyOnce Kafka工作流程 Kafka中消息是以topic进行分类的&#xff0c;Producer生产消息&#xff0c;Consumer消费消息&#xff0c;都是面向topic的。 Topic是逻辑上的概念&#xff…

流畅的 Python 第二版(GPT 重译)(十)

第十八章&#xff1a;with、match 和 else 块 上下文管理器可能几乎与子例程本身一样重要。我们只是初步了解了它们。[…] Basic 有一个 with 语句&#xff0c;在许多语言中都有 with 语句。但它们的功能不同&#xff0c;它们都只是做一些非常浅显的事情&#xff0c;它们可以避…

微服务day04(下) -- SpringAMQP

SpringAMQP SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;Spring AMQP SpringAMQP提供了三个功能&#xff1a; 自动声明队列、交换机及其绑定关系 基于注解的…