我正在尝试使用 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?
好吧,也许我在这里遗漏了一些东西,但这不是这么简单吗?
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)