gpt4 book ai didi

python - 如何对假设策略实现相对约束?

转载 作者:行者123 更新时间:2023-12-05 03:30:39 25 4
gpt4 key购买 nike

假设我有 2 个变量 ab,其中给定 b > a,那么我如何才能对假设策略?

from hypothesis import given, strategies as st

@given(st.integers(), st.integers())
def test_subtraction(a, b):
# only evaluates to true if b > a
# hence I'd like to enforce this constraint on the strategy
assert abs(b - a) == -(a - b)

最佳答案

(我不知道如何在 Python 中执行此操作,但这是一个很常见的问题,所以我希望您可以改用这些 F# FsCheck 示例。这些想法是通用的。)

过滤

大多数基于属性的框架都具有根据谓词过滤值的能力。在 FsCheck 中,它是 ==> 运算符。在 QuickCheck等效项称为 suchThat .

使用FsCheck中的==>操作符,可以这样写属性:

[<Property>]
let property_using_filtering (a : int) (b : int) =
b > a ==> lazy
Assert.Equal (abs (b - a), -(a - b))

(可以用更简洁和惯用的风格编写测试,但由于我假设您可能不熟悉 F#,所以我选择比平时更明确。)

请注意谓词 b > a 位于过滤运算符 ==> 之前。这意味着运算符右侧和下方的其余代码仅在谓词为真时运行。

框架仍将生成完全随机的值,因此(假设均匀随机分布)它将丢弃一半生成的值。

因此,要生成 100 个(默认)有效测试用例,它必须平均生成 200 个测试用例(即 400 个整数)。生成 400 个整数而不是 200 个整数可能没什么大不了的,但一般来说,这种过滤可能会非常浪费。

因此,了解备选方案总是很有用的。

种子和差异

当遇到这类问题时,换个角度看看如何生成值通常会有所帮助。如何生成两个值,其中一个值严格大于另一个值?

您可以生成一个随机值(种子),在这种情况下,它本身也将用作第一个值。然后第二个值将指示两者之间的差异。

一些基于属性的框架带有一些功能,您可以告诉它生成严格的正数。 FsCheck 具有这些功能,但假设目前并非所有框架都可以做到这一点,您仍然可以使用不受约束的随机值。

在那种情况下,作为任意随机数的差异可能同时为负数、零或正数。在这种情况下,我们可以取数字的绝对值然后加一以确保它严格大于零。现在你有一个保证大于零的数字。如果你把它加到第一个数字上,你肯定会得到比第一个数字更大的数字:

[<Property>]
let property_using_seed_and_diff (seed : int) (diff : int) =
let a = seed
let b = a + 1 + abs diff
Assert.Equal (abs (b - a), -(a - b))

这里,(有点多余)我们设置a = seed,然后根据上面的描述设置b = a + 1 + abs diff

(我只包含了多余的 seed 函数参数来说明总体思路。有时,您需要从种子计算出一个或多个值,而不是种子本身。但是在本例中,值和种子重合。)

关于python - 如何对假设策略实现相对约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70776721/

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