如何在 Go 测试中使用 math/rand 获得确定性结果而不通过随机数生成器?

问题描述 投票:0回答:1

我正在编写 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 random
1个回答
0
投票

你不能。 这不是语言或工具的失败,而是您的问题在概念层面上的内置问题。 你不能拥有一个既随机又确定的函数,就像你不能拥有一个完全红色和完全蓝色的球一样。 这些是相互排斥的概念。 事实上,你曾经能够做到这一点,这是之前语言的失败,他们纠正了这一点。

所以,虽然我完全理解为什么你想要做你所要求的事情,但在概念层面上这是不可能的,Go 的处理方式是正确的。 不幸的是,处理这个问题的惯用方法是经历将模拟 RNG 传递给所有测试并重写代码以接受它的麻烦。 作为一个安慰奖,这样做确实可以让你的代码在未来的变化中变得不那么脆弱。

© www.soinside.com 2019 - 2024. All rights reserved.