请在2024 Clojure 状态调查!分享您的想法。

欢迎!请查看关于页面了解更多此网站的工作方式。

0
规范

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

在同一时间

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

通常我发现在值倾向于范围的最小值(尤其是在 inst 情况下,值增长很多才会看起来不同)并不是我作为用户期望的。

但我认为问题是范围规范的预期行为是什么。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](https://clojure.atlassian.net/browse/CLJ-2179)(由 alexmiller 报告)
...