gpt4 book ai didi

Ruby:在代码中使用 rand() 但编写测试来验证概率

转载 作者:数据小太阳 更新时间:2023-10-29 06:56:01 27 4
gpt4 key购买 nike

我有一些代码可以根据加权随机数提供内容。权重越大的东西越有可能被随机选择。现在作为一名优秀的 ruby​​ist,我当然想用测试覆盖所有这些代码。我想测试是否根据正确的概率获取了东西。

那么我该如何测试呢?为应该是随机的东西创建测试使得很难比较实际与预期。我有一些想法,以及为什么它们不会很好地工作:

  • 在我的测试中 stub Kernel.rand 以返回固定值。这很酷,但是 rand() 被调用了多次,我不确定我是否可以通过足够的控制来装备它来测试我需要的东西。

  • 多次获取随机项目,并将实际比率与预期比率进行比较。但除非我可以无限次地运行它,否则这永远不会完美,并且如果我在 RNG 中运气不佳,可能会间歇性地失败。

  • 使用一致的随机种子。这使得 RNG 可重复,但它仍然无法验证项目 A 将在 80% 的时间内发生(例如)。

那么我可以使用什么样的方法来编写随机概率的测试覆盖率呢?

最佳答案

我认为你应该分开你的目标。一个是 stub Kernel.rand 正如你提到的那样。以 rspec 为例,你可以这样做:

test_values = [1, 2, 3]
Kernel.stub!(:rand).and_return( *test_values )

请注意,除非您以内核作为接收方调用 rand,否则此 stub 将无法工作。如果您只是调用“rand”,那么当前的“self”将收到消息,您实际上会得到一个随机数而不是 test_values。

第二个目标是进行类似于现场测试的操作,您可以在其中实际生成随机数。然后您将使用某种容差来确保您接近所需的百分比。不过,这永远不会是完美的,并且可能需要人工来评估结果。但这样做仍然很有用,因为您可能会意识到另一个随机数生成器可能会更好,例如从/dev/random 读取。此外,进行这种测试是件好事,因为假设您决定迁移到一种新的平台,该平台的系统库生成随机性的能力不佳,或者某个版本中存在一些错误。该测试可能是一个警告信号。

这实际上取决于您的目标。您只想测试您的加权算法,还是随机性?

关于Ruby:在代码中使用 rand() 但编写测试来验证概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6077725/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com