【问题标题】:Generating random numbers given a uniform random number generator给定一个统一的随机数生成器生成随机数
【发布时间】:2011-09-18 01:03:40
【问题描述】:

我被要求使用random(0,1) 生成ab 之间的随机数。 random(0,1) 生成一个介于 0 和 1 之间的统一随机数。

我回答了

(a+(((1+random(0,1))*b))%(b-a))

我的面试官对我在这段表达中使用b 不满意:

(((1+random(0,1))*b))

然后我尝试将答案更改为:

int*z=(int*)malloc(sizeof(int));
(a+(((1+random(0,1))*(*z)))%(b-a));

后来问题改为从random(1,5) 生成random(1,7)。我的回应是:

A = rand(1,5)%3
B = (rand(1,5)+1)%3
C = (rand(1,5)+2)%3

rand(1,7) = rand(1,5)+ (A+B+C)%3

我的答案正确吗?

【问题讨论】:

  • 请格式化代码,我已经告诉你如何
  • 无需提及您的未来雇主。我稍微改写了您的问题并格式化了所有内容,请考虑在继续更新之前查看我的编辑。
  • rand(1,7) := rand(1,5) 工作。
  • 当你说“在a和b之间”时,你的意思是b是一个可能的返回值吗?我猜random(0,1) 总是返回小于 1 的值?这会让这件事变得特别棘手。

标签: c++ c algorithm


【解决方案1】:
random(a,b) from random(c,d) = a + (b-a)*((random(c,d) - c)/(d-c))

没有?

【讨论】:

  • 没有。首先,从 [c,d] 映射到 [0,1],然后从 [0,1] 映射到 [a,b]。您在第一步中缺少random - c
  • 另外,这里可能有一个栅栏错误;我不记得你什么时候应该添加一个以获得正确的端点。
  • @Dennis:fenceposts 只有在我们谈论整数范围时才会成为问题。有理数/实数范围的宽度只是两端之间的差,无论范围内是否包括一个端点、一个端点或两个端点(即范围是开放的、半开放的还是封闭的)。只有整数(或其他非密集集合)的末端的开放性会影响范围的长度。
【解决方案2】:

随机(0,1)中的随机(a,b):

random(0,1)*(b-a)+a

随机(a,b)中的随机(c,d):

(random(a,b)-a)/(b-a)*(d-c)+c

或者,根据您的情况进行简化(a=1,b=5,c=1,d=7):

random(1,5) * 1.5 - 0.5

(注意:我假设我们讨论的是浮点值并且舍入误差可以忽略不计)

【讨论】:

    【解决方案3】:

    [random(0,1)*(b-a)] + a,我认为会给出随机数 b/w a&b。 ([random(1,5)-1]/4)*6 + 1 应该给出 (1,7) 范围内的随机数 我不确定以上是否会破坏均匀分布..

    【讨论】:

    • 方括号是什么意思?
    • @OpenSauce:为了便于阅读,只是交替使用括号。
    【解决方案4】:

    我的答案正确吗?

    我觉得有些问题。

    首先,我假设random() 返回一个浮点值 - 否则使用random(0,1) 生成更大范围数字的任何有用分布将需要重复调​​用以生成可使用的位池。

    我还将假设 C/C++ 是预期的平台,因为问题是这样标记的。

    鉴于这些假设,您的答案的一个问题是 C/C++ 不允许在浮点类型上使用 % 运算符。

    但即使我们设想% 运算符被替换为以合理方式对浮点参数执行模运算的函数,仍然存在一些问题。在您最初的回答中,如果b(或在您的第二次尝试中分配的未初始化的*z - 我假设这是一种获取任意值的奇怪方法,或者是其他意图?)为零(比如说给ab 的范围是(-5, 0)),那么你的结果肯定是不一致的。结果总是b

    最后,我当然不是统计学家,但在你的最终答案(从random(1.5) 生成random(1,7))中,我很确定A+B+C 将是不均匀的,因此会在结果。

    【讨论】:

      【解决方案5】:

      给定随机数(0,5),您可以通过以下方式生成随机数(0,7)

      A = 随机(0,5)*随机(0,5) 现在A的范围是0-25

      如果我们简单地取 A 的模 7,我们可以得到随机数,但它们不会是真正随机的,因为 A 从 22-25 的值,你会在模运算后得到 1-4 个值,因此得到模 7从范围(0,25)将输出偏向1-4。这是因为 7 不能整除 25:小于等于 25 的 7 的最大倍数是 7*3=21,而 21-25 不完全范围内的数字会导致偏差。

      解决此问题的最简单方法是丢弃这些数字(从 22 到 25)并继续再次平局,直到出现合适范围内的数字。

      显然,当我们假设我们需要随机整数时,这是正确的。

      但是,要获得随机浮点数,我们需要按照上述帖子中的说明相应地修改范围。

      【讨论】:

      • -1 给出一个完全错误的答案。为什么两个均匀随机数的乘积应该是均匀的?如果您已经在离散均匀分布的示例中看到它,您很容易看到在0..25 范围内有某些数字是您永远不会得到的,即素数。因此,结果绝不是另一个均匀分布。顺便说一句,即使是两个这样的随机变量的总和也不行。想想两个独立骰子的总和。
      • 这几乎是但不完全是均匀随机整数的正确技术。正如提问者所说,它应该是A = random(0,4) + 5 * random(0,4),其中端点在我的random 函数中包含。当然random(0,4) 只是random(1,5) - 1。然后重试最后几个值,并按照此处所述取 A 模 7。
      【解决方案6】:

      我认为您对随机整数生成器和随机浮点数生成器感到困惑。在 C++ 中,rand() 生成 0 到 32K 之间的随机整数。因此,要生成从 1 到 10 的随机数,我们编写 rand() % 10 + 1。因此,要生成从整数 a 到整数 b 的随机数,我们编写 rand() % (b - a + 1) +一种。

      面试官告诉你,你有一个从 0 到 1 的随机生成器,意思是浮点数生成器。

      如何从数学上得到答案:

      1. 将问题转换为简单形式,使下限为 0。
      2. 通过乘法缩放范围
      3. 重新切换到所需范围。

      例如:生成 R 使得

      a <= R <= b.  
      Apply rule 1, we get a-a <= R - a <= b-a 
                             0 <= R - a <= b - a.  
      

      将 R - a 视为 R1。如何生成 R1 使得 R1 的范围从 0 到 (b-a)?

      R1 = rand(0, 1) * (b-a)   // by apply rule 2.
      

      现在将 R1 替换为 R - a

      R - a = rand(0,1) * (b-a)    ==>   R = a + rand(0,1) * (b-a)
      

      ==== 第二个问题 - 没有解释 ====

      我们有 1

      ==>   0 <= R1 - 1             <= 4
      ==>   0 <= (R1 - 1)/4         <= 1
      ==>   0 <= 6 * (R1 - 1)/4     <= 6
      ==>   1 <= 1 + 6 * (R1 - 1)/4 <= 7
      

      因此,兰德(1,7) = 1 + 6 * (rand(1,5) - 1) / 4

      【讨论】:

      • 是的,生成随机整数时出错。
      • "因此,Rand(1,7) = 1 + 6 * (rand(1,5) - 1) / 4" 当 rand(1,5 ) 只能生成 5 个输出?
      • 我正在考虑 rand(1,5) 生成一个随机实数而不是整数。理论上,rand(1,5) 应该生成 1 到 5 之间的无限随机数。所以,rand(1,7) 仍然是无限的数字序列。
      【解决方案7】:

      我认为对此有更好的答案。有一个值(概率 -> 零)溢出,因此存在模数。

      1. 在区间[0,1]中取一个随机数 x

      2. 将可能是参数的 upper_bound 增加一。

      3. 计算 (int(random() / (1.0 / upper_bound)) % upper_bound) + 1 + lower_bound

      这应该返回一个你想要的间隔内的数字。

      【讨论】:

        猜你喜欢
        • 2023-01-03
        • 1970-01-01
        • 2018-04-03
        • 2018-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多