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

欢迎!请参阅关于页面以了解有关此内容的更多信息。

0
test.check
目前 {{gen/choose}} 是所有其他基于该生成的,并且它也是一个面向用户的生成器。它的当前实现接受一个 {{[0,1)}} 双倍并按所需范围缩放。这种方法随着范围的增大而退化,并且当范围大于 {{2^53}} 时,可能具有很差的属性。它还可以在范围是2的幂时进行更好的优化(无需经过 {{Double}})。考虑到 {{gen/choose}} 是面向用户的,我们应该尝试重新设计它,使其不会以这种方式退化,并且可以处理 bigints。

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的幂优化是否值得优化,与上面链接中的 {{SplittableRandom}} 一样吗?
* 当生成器可以返回 long 而不是 bigint 的时候,这一点有点微妙。例如,如果您调用 {{(gen/choose Long/MIN_VALUE Long/MAX_VALUE)}},那么在分析范围大小时,您将必须使用 bigint(因为 {{2^64}} 不能用 long 表示)。当两个参数都在 long 范围内时,{{gen/choose}}应该生成 longs,可能吗?
* 在不牺牲性能的情况下是否实际上可以满足上述要求?您认为这将只是一个生成器创建时间的变化,但 {{bind}} 可以模糊生成器和生成时间之间的界限。

3 答案

0

评论人:gfredericks

再次考虑后,我可能更倾向于让{{choose}}保持原样, discouraging its use by users,并添加一个特别设计用于处理任意范围的{{uniform-integer}}生成器。一个重要的问题是它在JavaScript中应该做什么,我对此有几个想法。

0
by

评论人:gfredericks

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

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