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 的幂次情况优化,与上面的 {{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)(由 gfredericks 提交)
...