Golang 1.19版本骰子随机数生成异常问题求助
问题解决:Go 1.19下rpgforge掷骰返回连续相同数字
问题描述
我数年前编写了一个用于模拟骰子投掷的rpgforge模块,可将“3d6”这类人类可读的掷骰规则转换为实际的多次掷骰逻辑,用来支持我的纸笔RPG爱好。该模块近4年未做改动,在Go 1.18(Ubuntu环境)下运行正常,但升级到Go 1.19(Win11环境)后,调用forge.ThrowDices("10d10")返回的结果却是连续相同的数字,而非预期的多样随机组合。
示例代码:
package main import ( "fmt" "math/rand" "time" forge "github.com/parasit/rpgforge" ) func main() { rand.Seed(time.Now().UTC().UnixNano()) for x := 0; x < 10; x++ { fmt.Println(forge.ThrowDices("10d10")) } }
解决方案
经排查,问题根源在于rpgforge模块的掷骰逻辑中,每次执行掷骰操作时都会重新初始化随机数生成器。Go版本升级后,这种重复初始化的行为导致随机数序列始终从同一个起点生成,最终返回连续相同的结果。
解决步骤:
- 移除模块内所有掷骰操作中的随机数初始化代码
- 在调用该模块的程序入口处(如示例的
main函数)手动执行一次随机数初始化(示例中已包含rand.Seed(time.Now().UTC().UnixNano()),保留即可;若使用Go 1.20及以上版本,可省略Seed调用,直接使用默认随机源)
内容的提问来源于stack exchange,提问作者parasit
相关产品推荐
相关产品推荐

