给定均匀随机数生成器生成随机数

时间:2011-06-19 05:04:17

标签: c++ c algorithm

我被要求使用a生成brandom(0,1)之间的随机数,包括在内。 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,7)

稍后问题已更改为从random(1,5)生成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 。我回答说:

{{1}}

我的答案是否正确?

7 个答案:

答案 0 :(得分:8)

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

面试官告诉你,你有一个从0到1的随机发生器。它意味着浮点数发生器。

如何以数学方式得出答案:

  1. 将问题转换为简单形式,使下限为0.
  2. 通过乘法缩放范围
  3. 重新切换到所需范围。
  4. 例如:生成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.
    

    现在用R替换R1 - a

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

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

    我们有1 <= R1 <= 5

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

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

答案 1 :(得分:4)

随机(a,b)来自随机(0,1):

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

随机(c,d)来自随机(a,b):

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

或,为您的情况简化(a = 1,b = 5,c = 1,d = 7):

random(1,5) * 1.5 - 0.5

(注意:我假设我们正在谈论浮动值,并且舍入错误可以忽略不计)

答案 2 :(得分:2)

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

没有

答案 3 :(得分:1)

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

答案 4 :(得分:0)

  

我的答案是否正确?

我认为有一些问题。

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

我也会假设C / C ++是预期的平台,因为这个问题被标记为。

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

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

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

答案 5 :(得分:0)

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

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

  2. 将可以作为参数的upper_bound加1。

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

这应该在您希望的时间间隔内返回一个数字。

答案 6 :(得分:-2)

给定随机(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:7的最大倍数小于或等于25是7 * 3 = 21而且是21-25的不完全范围内的数字会导致偏差。

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

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

但是要获得随机浮点数,我们需要相应地修改范围,如上文所述。