请分享你在2024 年 Clojure 状态调查!中的想法。

欢迎!请参阅关于页面,了解此处的更多信息。

0
test.check
目前{{gen/choose}}是基于所有其他生成器的生成器,它也是一个面向用户的生成器。它当前的实现接受一个{{[0,1)}}双精度值并将其缩放到需求范围。这种方法在更高的情况下与分布相退化,并且当你的范围大于{{2^53}}时,可能会具有相当糟糕的性质。它还可以在范围是2的幂的情况下进行更好的优化(不需要通过{{Double}})。鉴于{{gen/choose}}是面向用户的,我们应该尝试重新设计它,使其不会以此种方式退化,并且能够处理bigint。

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] 类在无需通过浮点数的情况下生成整数范围。我们应该检查这是否更快,因为它肯定是一个更均匀的分布。
* 优化两个幂的情况是否值得,就像链接上面的SplittableRandom做的那样?
* 当生成器可以返回long而不是bigint时的情况有些微妙。例如,如果你调用{{(gen/choose Long/MIN_VALUE Long/MAX_VALUE)}},然后分析范围的大小时,你必须使用bigint(因为{{2^64}}无法表示为long)。{{gen/choose}}在两个参数都在long范围内时生成long,可能是吗?
实际上在没有性能损失的情况下满足上述要求是否可能?你认为这只是生成器创建时间的变化,但是{{bind}}可以在生成器创建和生成时间之间模糊界限。

3 答案

0

评论为:gfredericks

经过再次考虑,我可能更倾向于让{{choose}}保持现状,并鼓励用户不要使用它,同时添加一个专门设计用于处理任意范围的{{uniform-integer}}生成器。一个重要的问题是它在JavaScript中应该做什么,关于这一点我有几个想法。

0

评论为:gfredericks

我正在重新考虑,与仅仅设计一套更干净的新生成器相比,这真的是一个好主意吗?

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