【发布时间】:2018-04-03 12:29:03
【问题描述】:
假设给你一个 int randBit() 函数,它返回均匀分布的 0 或 1。
写一个 randNumber(int max) 函数。
这是我的实现,但我无法证明/反驳它是正确的。
// max number of bits
int i = (int)Math.floor(Math.log(max) / Math.log(2)) + 1;
int ret = randBit();
while (i-- > 0) {
ret = ret << 1 | randBit();
}
return ret;
我的基本想法是
- 找出数字中存在的位数
- 然后通过连续连接 LSB 直到满足位长来生成数字
【问题讨论】:
-
这种方法对于 2 的幂(或 2 的幂减一:你不清楚
max是包含还是排除)是合理的,但是想想当数字是不是 2 的幂。例如,当max是 6 时。 -
如果最大值为 2,我会得到 0 到 7 之间的结果。
标签: random binary numbers bit-manipulation bit