You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让RNG针对相同输入返回一致结果?Godot开发技术问询

问题原因

你现在的问题出在复用了同一个RNG实例:第一次调用修改函数时,RNG已经生成了若干随机数,内部状态发生改变;第二次、第三次调用时,RNG是基于前一次调用后的状态继续生成随机数,自然没法得到和第一次一样的结果。

另外注意:Godot里字符串是不可变类型,你原代码里直接return_string[index] = ...的写法无效,得用字符串拼接的方式修改字符。

解决方案

有两种可行的解决思路:

思路1:每次调用函数前重置RNG

每次调用修改函数前,重新创建RNG实例并设置相同seed,确保每次函数调用时RNG都从初始状态开始:

# 每次调用都重新初始化RNG
var test_rand = RandomNumberGenerator.new()
test_rand.seed = hash("Simple key")
print(modify_text("Hello", alphabet, test_rand))

test_rand = RandomNumberGenerator.new()
test_rand.seed = hash("Simple key")
print(modify_text("Hello", alphabet, test_rand))

test_rand = RandomNumberGenerator.new()
test_rand.seed = hash("Simple key")
print(modify_text("Hello", alphabet, test_rand))

思路2:基于输入字符串生成唯一seed(更推荐)

在修改函数内部,用输入字符串+固定密钥生成唯一seed,这样同一个输入字符串永远对应同一个随机修改结果,无需外部管理RNG状态:

func modify_text(text: String, alphabet: Array) -> String:
    # 用输入文本+固定密钥生成专属seed,确保同一输入对应同一随机序列
    var rng = RandomNumberGenerator.new()
    rng.seed = hash(text + "Simple key")
    
    var return_string = text
    var changed_indexes = []
    var index
    for i in text.length():
        while true:
            index = rng.randi_range(0, text.length() - 1)
            if index not in changed_indexes:
                changed_indexes.append(index)
                break
        # 修正字符串修改方式:不可变类型需用substr拼接
        return_string = return_string.substr(0, index) + alphabet[rng.randi() % alphabet.size()] + return_string.substr(index + 1)
    return return_string

调用时直接传输入字符串和字母表即可:

print(modify_text("Hello", alphabet))
print(modify_text("Hello", alphabet))
print(modify_text("Hello", alphabet))

这样三次输出结果会完全一致。

内容的提问来源于stack exchange,提问作者DotFX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:57:21