0 <= x < 2^64 之间的 Scalacheck 数字生成器

Chr*_*art 5 scala scalacheck

我正在尝试使用 C 语言修复一个很好的数字生成器uint64_t。这是我目前所拥有的。

def uInt64s : Gen[BigInt] = Gen.choose(0,64).map(pow2(_) - 1)
Run Code Online (Sandbox Code Playgroud)

这是一个好的开始,但它只生成数字2^n - 1。有没有更有效的方法来生成随机 BigInts 同时保留数字范围0 <= n < 2^64

sth*_*lzm 6

好吧,也许我在这里遗漏了一些东西,但这不是这么简单吗?

def uInt64s : Gen[BigInt] = Gen.chooseNum(Long.MinValue,Long.MaxValue)
                               .map(x => BigInt(x) + BigInt(2).pow(63))
Run Code Online (Sandbox Code Playgroud)

Longs 已经有正确的位数 - 只需添加 2^63 所以Long.MinValue变为 0 并Long.MaxValue变为 2^64 - 1。BigInt当然,用s 进行加法。


我很好奇生成值的分布。显然分布chooseNum不均匀,因为它更喜欢特殊值,但是对于 UInt64s,Longs 的边缘情况可能也很有趣:

/** Generates numbers within the given inclusive range, with
  *  extra weight on zero, +/- unity, both extremities, and any special
  *  numbers provided. The special numbers must lie within the given range,
  *  otherwise they won't be included. */
def chooseNum[T](minT: T, maxT: T, specials: T*)(
Run Code Online (Sandbox Code Playgroud)