Algorithm 如何仅使用一点就在低位和高位之间生成数字?
我在一次采访中被问到这个问题,所以我不想要解决方案,只想要关于如何解决这个问题的指导 你得到了两个数字:低和高。以及生成0和1的随机生成器。我必须使用该函数生成一个介于低和高之间的数字 我可以得到这两个数字之间的差异,并尝试通过位操作生成一个数字。但是我不知道怎么做?你可以做:Algorithm 如何仅使用一点就在低位和高位之间生成数字?,algorithm,bit-manipulation,Algorithm,Bit Manipulation,我在一次采访中被问到这个问题,所以我不想要解决方案,只想要关于如何解决这个问题的指导 你得到了两个数字:低和高。以及生成0和1的随机生成器。我必须使用该函数生成一个介于低和高之间的数字 我可以得到这两个数字之间的差异,并尝试通过位操作生成一个数字。但是我不知道怎么做?你可以做: 范围=高-低 查找n,这样2^n-1
范围=高-低
n
,这样2^n-1
- 将
high
减少1,将low
增加1(如果后面引入的随机位都等于high
或low
中的随机位)
- 创建布尔值
high_dec
和low inc
,以存储high
中是否至少有一个1已更改为0,以及low
中是否至少有一个0已更改为1,并将这两个值都设置为false(这将有助于避免结果超出范围)
- 将从MSB到LSB的
高位
和低位
逐位与以下情况进行比较:
- 如果发现
high:1
和low:1
则在low_inc=false
时存储一个1,否则存储一个随机位(并根据需要更新high_dec
)
- 如果发现
high:1
和low:0
,则存储一个随机位(并根据需要更新high\u dec
或low\u inc
)
- 如果发现
high:0
和low:1
,则在high\u dec=false
时存储0,或者在low\u inc=false
时存储1,否则存储随机位
- 如果发现
high:0
和low:0
则在high\u dec=false
时存储一个0,否则存储一个随机位(并根据需要更新low\u inc
)
请注意,只有当最低可能结果为2的幂,且范围为2的幂时,随机数的分布才是均匀的。在所有情况下都使用整个范围,但可能会强调范围开始或结束附近的值
(a,b)之间的函数{
var lo=(a+1).toString(2).split(“”),//转换为位数组,因为
hi=(b-1).toString(2.split(“”),//JS中没有位操作
lc=false,//低位已更改
hc=false,//高位已更改
结果=[];
while(lo.length 文件。写(介于(9999991000100)+“
”在得到n之后,我应该运行一个while循环,在那里我应该生成1和0,并将它们放在最左边?我的意思是,我必须从最左边开始,对吗?不管是右边还是左边。这是一个随机数,所以当你考虑它时,选择的顺序是不相关的。不,我的意思是,当生成一个随机数时,如果我从右边开始,我可以生成一个大于差值的数。另一方面,如果我从左边开始,我可以丢弃使它变大的1,然后用0。真的。在那种情况下,你可以想出任何规则。重新启动,包装数字(低+随机%范围),…@Dude:您没有生成数字。您正在生成步骤2中定义的大小为“n”的随机序列。当你把这个随机序列的等价整数加到较小的数上,你会得到另一个比较小的数大但比较大的数小的数。对不起;我不应该在没有先测试的情况下发布它。现在可以用了。我还添加了一个关于分布的注释。low可能太简单了,那么low+(high-low)/2如何?@greybeard这个问题实际上是关于在low和high之间生成随机数,但它的措辞不是很清楚。