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