2024 Clojure 状况调查!(英文) 中分享您的想法!

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

0
test.check
目前,{{gen/choose}} 是其他所有内容的基础生成器,也是面向用户的生成器。它的当前实现接受一个 {{[0,1)}} 双精度数并将其缩放到所需范围。这种方法随着范围的增大而降低分布质量,并且当范围大于 {{2^53}} 时,可能具有非常糟糕的性质。它还可以在范围是 2 的幂时优化得更好(无需通过 {{Double}})。鉴于 {{gen/choose}} 是面向用户的,我们应该尝试重新设计它,使其不会以这种方式退化,并能处理大整数。

h2. 需求

h3. {{gen/choose}} 应该在任何界限下都具有均匀分布

h3. {{gen/choose}} 应该接受任意整数界限并正确处理它们

h2. 要调查的事项

* 注意,[SplittableRandom|https://github.com/openjdk-mirror/jdk/blob/adea42765ae4e7117c3f0e2d618d5e6aed44ced2/src/share/classes/java/util/SplittableRandom.java#L263-308] 类生成整数范围时不需要经过浮点数。我们应该检查这是否更快,因为它的分布肯定更均匀。
* 是否值得为 2 的幂次 situations 进行优化,就像上面链接中的 {{SplittableRandom}} 所做的那样?
* 当生成器可以返回 long 而不是 bigint 时有些微妙。例如,如果您调用 {{(gen/choose Long/MIN_VALUE Long/MAX_VALUE)}}, 那么,在分析范围大小时,您将必须使用 bigint(因为 {{2^64}} 不能表示为 long)。也许 {{gen/choose}} 应该在两个参数都在 long 范围内时生成 long, 对吧?
* 是否可以在不产生性能损失的情况下满足上述要求?您会认为这只是一次生成器创建时间的变化,但 {{bind}} 可以在创建时间和生成时间之间模糊界限。

3 个答案

0

评论者:gfredericks

重新考虑后,我可能更倾向于保留{{选择的}}不变,并劝阻用户使用它,同时添加一个专为处理任意范围而设计的{{均匀整数}}生成器。一个重要问题是它在JavaScript中应该怎么做,我对此有一些想法。

0
by

评论者:gfredericks

我正在重新考虑这个想法,与只设计一套更干净的生成器相比。

0
by
参考:[https://clojure.atlassian.net/browse/TCHECK-70](https://clojure.atlassian.net/browse/TCHECK-70)(由gfredericks报告)
...