Algorithm 如何仅使用一点就在低位和高位之间生成数字?

Algorithm 如何仅使用一点就在低位和高位之间生成数字?,algorithm,bit-manipulation,Algorithm,Bit Manipulation,我在一次采访中被问到这个问题,所以我不想要解决方案,只想要关于如何解决这个问题的指导 你得到了两个数字:低和高。以及生成0和1的随机生成器。我必须使用该函数生成一个介于低和高之间的数字 我可以得到这两个数字之间的差异,并尝试通过位操作生成一个数字。但是我不知道怎么做?你可以做: 范围=高-低 查找n,这样2^n-1

我在一次采访中被问到这个问题,所以我不想要解决方案,只想要关于如何解决这个问题的指导

你得到了两个数字:低和高。以及生成0和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)+“