2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!有关此功能的工作方式,请参阅关于 页面以获取更多信息。

0 投票
Spec

s/inst-in 和 s/int-in 生成器基于 gen/large-integer*,从 0 开始增长。

`
(require '[clojure.spec.alpha :as s] '[clojure.spec.gen.alpha :as gen])
(gen/sample (s/gen (s/int-in 0 100)))
;;=> (1 0 1 1 1 0 1 1 72 1)

(gen/sample (s/gen (s/inst-in #inst "2001-01-01" #inst "2001-12-31")))
;;=> (#inst "2001-01-01T00:00:00.000-00:00" #inst "2001-01-01T00:00:00.000-00:00" #inst "2001-01-01T00:00:00.001-00:00" #inst "2001-01-01T00:00:00.001-00:00" ...)
`

建议: 相反,s/inst-in 应使用均匀分布生成器

在相同之后

`
(26 16 65 96 63 37 31 4 94 9)

(#inst "2001-03-03T04:51:43.702-00:00"
#inst "2001-07-25T07:13:03.224-00:00"
#inst "2001-03-31T18:28:41.625-00:00"
#inst "2001-04-17T19:33:14.176-00:00"
#inst "2001-01-14T07:03:08.521-00:00"
#inst "2001-06-06T09:52:03.421-00:00" ...)
`

补丁: clj-2179.patch

6 个答案

0 投票

评论者:gfredericks

这个问题试图解决什么问题?

0 投票

评论者:alexs

通常我发现值偏向于范围的 minimum 值(尤其是在 inst 的情况下,值必须增长得多才能显得不同)不是用户所期望的。

但我认为问题是范围规范的目标行为应该是什么。Rich 和 Stu 是否同意,我还不清楚。:)

0 投票
by

评论者:gfredericks

例如,我建议至少单独生成时间戳组件(年、月、日、小时等)并用 {{gen/fmap}} 组合它们。这样可以使它更自然地缩小,并使指定偏向于当前值的任何策略变得更加容易。

关于整数范围,我只想指出 test.check 的一个特性是使用“小”值开始测试,因此你必须根据均匀分布的程度抵消这个特性。

0 投票
by
_发表评论的人:gfredericks_

如果你需要一个生成器,它从最小值和最大值开始,并且可以缩小到任一值,以下内容应该可以工作


(defn bi-biased-int-range
  [min max]
  (let [g (gen/large-integer* {:min min, :max max})
        g' (gen/let [x g] (- max (- x min)))]
    (gen/one-of [g g'])))
0 投票
by

发表评论的人:stu

也许这两个案例需要单独考虑。我喜欢 Gary 关于时间戳的想法,而认为整数生成器应保持不变。

0 投票
by
参考:[https://clojure.atlassian.net/browse/CLJ-2179](https://clojure.atlassian.net/browse/CLJ-2179)(由 alexmiller 报告)
...