如何让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
相关产品推荐
相关产品推荐

