RandomNumberGenerator

继承: RefCounted < Object

提供生成伪随机数的方法。

描述

RandomNumberGenerator是一个用于生成伪随机数的类。它目前使用PCG32

注意:底层算法是一个实现细节,不应依赖它。要基于时间相关的种子生成一个随机浮点数(在给定范围内):

var rng = RandomNumberGenerator.new()
func _ready():
    var my_random_number = rng.randf_range(-10.0, 10.0)

属性

方法

int

rand_weighted(weights: PackedFloat32Array)

float

randf()

float

randf_range(from: float, to: float)

float

randfn(mean: float = 0.0, deviation: float = 1.0)

int

randi()

int

randi_range(from: int, to: int)

void

randomize()


属性说明

int seed = 0 🔗

  • void set_seed(value: int)

  • int get_seed()

根据给定的种子值初始化随机数生成器状态。给定的种子将生成可重现的伪随机数序列。

注意:随机数生成器没有雪崩效应,在给定相似种子的情况下可能会输出相似的随机流。如果种子来自外部,考虑使用哈希函数来提高种子质量。

注意:设置此属性会产生更改内部state的副作用,因此请确保在修改state之前初始化种子。

注意:此属性的默认值是伪随机的,在调用randomize()时会发生变化。此处记录的0值是一个占位符,并非实际的默认种子。

var rng = RandomNumberGenerator.new()
rng.seed = hash("i3D")
rng.state = 100 # 恢复到之前保存的某个状态。

int state = 0 🔗

  • void set_state(value: int)

  • int get_state()

随机数生成器的当前状态。保存并恢复此属性,可将生成器恢复到先前状态:

var rng = RandomNumberGenerator.new()
print(rng.randf())
var saved_state = rng.state # Store current state.
print(rng.randf()) # 使用自定义曲线来插值该值。提升内部状态。
rng.state = saved_state # Restore the state.
print(rng.randf()) # 打印出与之前相同的值。

注意:请勿将状态设置为任意值,因为随机数生成器要求状态具备特定属性才能正常运行。它只能设置为来自状态属性本身的值。若要使用任意输入初始化随机数生成器,请改用seed注意:此属性的默认值是伪随机的,调用randomize()时会发生变化。此处记录的0值是一个占位符,并非实际的默认种子值


方法说明

int rand_weighted(weights: PackedFloat32Array) 🔗

返回一个具有非均匀权重的随机索引。如果数组为空,则打印错误并返回-1

var rng = RandomNumberGenerator.new()

var my_array = ["one", "two", "three", "four"]
var weights = PackedFloat32Array([0.5, 1, 1, 2])

# 打印出 `my_array` 中的其中一个元素。
# 它更有可能打印出 "four", 而不太可能打印出 "one".
print(my_array[rng.rand_weighted(weights)])

float randf() 🔗

返回0.01.0(含)之间的伪随机浮点数。


float randf_range(from: float, to: float) 🔗

返回fromto(含)之间的伪随机浮点数。


float randfn(mean: float = 0.0, deviation: float = 1.0) 🔗

返回normally-distributed、指定mean的伪随机浮点数和标准deviation。这也称为高斯分布。

注意:此方法使用Box-Muller变换算法。


int randi() 🔗

返回04294967295(含)之间的伪随机32位无符号整数。


int randi_range(from: int, to: int) 🔗

返回fromto(含)之间的伪随机32位有符号整数。


void randomize() 🔗

为此RandomNumberGenerator实例设置基于时间的种子。与@GlobalScope随机数生成函数不同,不同的RandomNumberGenerator实例可以使用不同的种子。