当前地 {{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}} 可以模糊生成器创建和生成时间之间的界限。