理解 Go 的 rand.Intn
Go 标准库提供了用于生成随机数的 rand 包。但是,rand.Intn(n) 函数在重复调用时始终返回相同的值。这种行为提出了为什么会发生的问题。答案在于两个关键因素。
未初始化的全局源
默认情况下,rand 包使用生成确定性值序列的全局源。这意味着像 rand.Intn() 这样的函数的输出保持不变,除非这个 Source 用种子初始化。
要解决这个问题,必须使用 rand.Seed() 设置一个随机种子。一种常见的方法是使用从 time.Now().UnixNano() 获得的时间戳作为种子:
rand.Seed(time.Now().UnixNano())
这会初始化 Source 并将随机性引入到 rand.Intn() 生成的序列中。
Go Playground 缓存
导致观察到的行为的另一个因素是去游乐场。此在线工具会缓存代码片段的输出,这可能会导致相同的随机数序列始终显示,而不管实际的随机性如何。
为避免此缓存问题,建议在本地运行代码。这确保了在执行时生成随机种子,从而产生唯一的值序列。
通过初始化全局 Source 并避免 Go Playground 缓存,可以确保 rand.Intn() 生成真正的随机数Go 程序中的数字。
以上是为什么 Go 的 rand.Intn() 会重复返回相同的数字?的详细内容。更多信息请关注PHP中文网其他相关文章!