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

欢迎!有关如何工作的更多信息,请参阅关于页面。

0
Spec

“s/inst-in”和“s/int-in”生成器基于从0增长的gen/large-integer*。

`
(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”应使用均匀分布生成器

After on same

`
(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

评论人:alexmiller

通常我发现值为范围的最小值(特别是在实例中,值必须增长很多才能看起来不同)偏向,这并不是作为用户所期望的。

但我认为这个问题是关于范围规范(range specs)的预期行为。我不知道Rich和Stu是否会达成一致,但我会。

0

评论人:gfredericks

例如,我建议至少分别生成时间戳的组件(年、月、日、小时等)并与 {{gen/fmap}} 结合。这样可以更自然地缩小范围,并使指定您喜欢向当前值偏置的策略更容易。

关于整数的范围,我只想指出 test.check 的一个特性是以 "小" 值开始测试,所以无论您施加多么均匀的分布,都会抵消该特性。

0
_评论人: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

评论人:stu

也许这两个案例需要分开考虑。我喜欢 Gary 对于时间戳的想法,认为整数生成器应该保持原样。

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