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