randomize
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — randomize
randomize
定义
randomize() 用于初始化随机数种子,让每次运行游戏时生成的随机数都不一样。
想象你有一本"随机数字本"——里面有无数个数字。如果你每次都从第一页开始读(相同的种子),每次看到的数字顺序就完全一样。randomize() 的作用就像随机翻到这本本的某一页开始读,这样每次运行游戏时"翻到的页码"不同,后续的随机数序列也就不同了。
在 Godot 4.x 中,项目启动时会自动调用 randomize(),所以通常你不需要手动调用它。但在某些特殊情况下(比如你需要可重现的随机序列时),了解它的工作原理很重要。
函数签名
C#
// C# 中使用 GD.Randomize
GD.Randomize();GDScript
func randomize() -> void参数说明
无参数。调用时不需要传入任何值。
返回值
无返回值(void)。此函数仅用于初始化全局随机数生成器的种子。
代码示例
基础用法:初始化随机种子
C#
using Godot;
public partial class RandomizeExample : Node
{
public override void _Ready()
{
// 手动初始化随机种子(Godot 4.x 默认自动调用,通常不需要手动调用)
GD.Randomize();
// 之后的所有 randi/randf 调用都会使用新的随机种子
int dice = GD.RandRange(1, 6);
GD.Print($"骰子: {dice}");
// 运行结果: 骰子: 3(每次运行结果不同)
}
}GDScript
extends Node
func _ready():
# 手动初始化随机种子(Godot 4.x 默认自动调用,通常不需要手动调用)
randomize()
# 之后的所有 randi/randf 调用都会使用新的随机种子
var dice = randi_range(1, 6)
print("骰子: ", dice)
# 运行结果: 骰子: 3(每次运行结果不同)实际场景:可重现与不可重现的随机
C#
using Godot;
public partial class RandomDemo : Node
{
public override void _Ready()
{
GD.Print("=== 模式一:每次运行结果不同(随机种子)===");
GD.Randomize();
for (int i = 0; i < 3; i++)
{
GD.Print($"随机数 {i + 1}: {GD.RandRange(1, 100)}");
}
GD.Print("");
GD.Print("=== 模式二:每次运行结果相同(固定种子)===");
// 使用固定种子,结果可重现
GD.Seed(12345);
for (int i = 0; i < 3; i++)
{
GD.Print($"随机数 {i + 1}: {GD.RandRange(1, 100)}");
}
// 运行结果:
// === 模式一:每次运行结果不同(随机种子)===
// 随机数 1: 72
// 随机数 2: 15
// 随机数 3: 88
//
// === 模式二:每次运行结果相同(固定种子)===
// 随机数 1: 34(每次都是这个值)
// 随机数 2: 67(每次都是这个值)
// 随机数 3: 12(每次都是这个值)
}
}GDScript
extends Node
func _ready():
print("=== 模式一:每次运行结果不同(随机种子)===")
randomize()
for i in range(3):
print("随机数 %d: %d" % [i + 1, randi_range(1, 100)])
print("")
print("=== 模式二:每次运行结果相同(固定种子)===")
# 使用固定种子,结果可重现
seed(12345)
for i in range(3):
print("随机数 %d: %d" % [i + 1, randi_range(1, 100)])
# 运行结果:
# === 模式一:每次运行结果不同(随机种子)===
# 随机数 1: 72
# 随机数 2: 15
# 随机数 3: 88
#
# === 模式二:每次运行结果相同(固定种子)===
# 随机数 1: 34(每次都是这个值)
# 随机数 2: 67(每次都是这个值)
# 随机数 3: 12(每次都是这个值)进阶用法:多人游戏同步随机状态
C#
using Godot;
public partial class MultiplayerSync : Node
{
// 多人游戏中,服务器用随机种子,客户端用相同的种子来同步
public void StartMatch(uint matchSeed)
{
GD.Print($"比赛种子: {matchSeed}");
// 所有玩家使用相同的种子,确保随机事件一致
GD.Seed(matchSeed);
// 随机生成天气
int weather = GD.RandRange(0, 2);
string[] weathers = { "晴天", "雨天", "雪天" };
GD.Print($"天气: {weathers[weather]}");
// 随机生成风力
int wind = GD.RandRange(1, 5);
GD.Print($"风力等级: {wind}");
}
public override void _Ready()
{
// 服务器生成随机种子并广播给所有客户端
GD.Randomize();
uint matchSeed = GD.Randi();
StartMatch(matchSeed);
}
}GDScript
extends Node
# 多人游戏中,服务器用随机种子,客户端用相同的种子来同步
func start_match(match_seed: int) -> void:
print("比赛种子: ", match_seed)
# 所有玩家使用相同的种子,确保随机事件一致
seed(match_seed)
# 随机生成天气
var weather = randi_range(0, 2)
var weathers = ["晴天", "雨天", "雪天"]
print("天气: ", weathers[weather])
# 随机生成风力
var wind = randi_range(1, 5)
print("风力等级: ", wind)
func _ready():
# 服务器生成随机种子并广播给所有客户端
randomize()
var match_seed = randi()
start_match(match_seed)注意事项
Godot 4.x 自动调用:在 Godot 4.x 中,项目启动时会自动调用
randomize(),所以你通常不需要手动调用它。但在 Godot 3.x 中,必须手动调用。与
seed()的关系:randomize()使用系统时间等随机来源设置种子(每次不同),seed()使用你指定的数字作为种子(可重现)。两者设置的都是同一个全局随机数生成器。只影响全局随机函数:
randomize()只影响randi()、randf()、randi_range()、randf_range()、randfn()这些全局函数。如果你创建了RandomNumberGenerator的实例,它有自己独立的种子,不受randomize()影响。C# 中使用
GD.Randomize():C# 中对应的函数是GD.Randomize(),行为一致。
