我正在编写 Go 测试,需要使用 math/rand 包的函数得出确定性结果。但是,我不想将随机数生成器 (RNG) 显式传递给这些函数,因为这需要更改多个函数和测试。
在 Go 的早期版本中,我可以通过在测试中使用常量调用 rand.Seed 来实现此目的。但从 Go 1.20 开始,以这种方式使用 rand.Seed 已被弃用。官方文档建议对本地 RNG 使用 rand.New(rand.NewSource(seed)) ,但这需要传递 RNG,我想避免这种情况。
鉴于 rand.Seed 已弃用,如何在不显式通过 RNG 的情况下在测试中获得确定性结果?是否有其他方法可以保持测试播种的便利性?
我尝试使用
rand.New(rand.NewSource(42))
(不通过 RNG)而不是 rand.Seed(42)
,但这不会产生确定性结果。
你不能。 这不是语言或工具的失败,而是您的问题在概念层面上的内置问题。 你不能拥有一个既随机又确定的函数,就像你不能拥有一个完全红色和完全蓝色的球一样。 这些是相互排斥的概念。 事实上,你曾经能够做到这一点,这是之前语言的失败,他们纠正了这一点。
所以,虽然我完全理解为什么你想要做你所要求的事情,但在概念层面上这是不可能的,Go 的处理方式是正确的。 不幸的是,处理这个问题的惯用方法是经历将模拟 RNG 传递给所有测试并重写代码以接受它的麻烦。 作为一个安慰奖,这样做确实可以让你的代码在未来的变化中变得不那么脆弱。