【问题标题】:Generate integer random number using available binaryrandom (which return 0 or 1) function使用可用的 binaryrandom(返回 0 或 1)函数生成整数随机数
【发布时间】:2020-12-25 04:45:28
【问题描述】:

在最近的一次采访中,我遇到了以下问题

给定一个随机返回 0 或 1 的函数 BinaryRandom(),创建 一个函数 int MyRandom(int) 创建一个随机数小于或 等于使用 BinaryRandom() 的给定输入。

由于我是每日堆栈溢出和 GeeksForGeeks 用户,我记得 GeeksForGeeks 上有类似的问题,请参阅下面的链接

https://www.geeksforgeeks.org/implement-random-0-6-generator-using-the-given-random-0-1-generator/

唯一的区别是 GeeksForGeeks 的范围是 0-6,而在我的例子中,范围是

上述解决方案是使用以下链接从 SO 派生的

Creating a random number generator from a coin toss.

作为算法的初学者,我发现上面很难理解。任何人都可以为上述问题提出一个简单的解决方案吗?或者给个简单的理解?

【问题讨论】:

  • 您需要说明下限。例如,如果 N 为 3,则有无限多个小于 N 的整数:2、1、0、-1、-2、-3,... 可能您的下限是 0 或 1(含),但我们不知道哪个直到你说出来。
  • “我觉得很难理解”不是一个非常精确的陈述。你能试着找到更准确的说法吗?在 SO 的答案中是否有某个地方您阅读了一个句子并且无法完全掌握它?你能把它变成一个你可以问的具体问题吗?

标签: c algorithm random


【解决方案1】:

建立在 chux 的答案上是一个简单的实现:

int MyRandom(int max) {
    for (;;) {
        int r = 0;
        for (m = max; m > 0; m >>= 1) {
            r += r + BinaryRandom();
        }
        if (r <= max || max < 0)
            return r;
    }
}

【讨论】:

    【解决方案2】:

    给定一个返回 0 或 1 的函数 BinaryRandom()
    创建一个函数 int MyRandom(int) 创建一个小于或等于给定输入的随机数

    int MyRandom(int max);
    
    1. 查找max 的位宽 --> bitwidth。也许计算右移直到 0。例如对于max == 42,我们需要 6 位。

    2. 调用BinaryRandom()形成随机数。例如。 6位,将形成一个数字[0...63]

      int r = 0;
      // Double the value each iteration and add new bit.
      for (i = 0; i<bitwidth; i++) r = 2*r + BinaryRandom();  
      
    3. 确保没有超出范围:如果r &gt; max,请重复步骤 2。

    4. 返回r

    有一些方法(未显示)可以减少必须重做第 2 步的机会,但我们希望通过执行r_from_more_than_6_iterations%42 之类的操作来避免结果偏差。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-21
      • 2014-09-22
      • 1970-01-01
      • 2012-11-21
      • 2013-04-21
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      相关资源
      最近更新 更多