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

tib*_*ama 3 c c++ algorithm

有人问我产生之间的随机数ab,包容,使用random(0,1).random(0,1)生成0到1之间的均匀随机数.

我回答了

(a+(((1+random(0,1))*b))%(b-a))
Run Code Online (Sandbox Code Playgroud)

我的采访者对我b在这段表达中的用法不满意:

(((1+random(0,1))*b))
Run Code Online (Sandbox Code Playgroud)

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

int*z=(int*)malloc(sizeof(int));
(a+(((1+random(0,1))*(*z)))%(b-a));
Run Code Online (Sandbox Code Playgroud)

后来这个问题改变产生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
Run Code Online (Sandbox Code Playgroud)

我的答案是否正确?

bad*_*awi 8

我认为你在随机整数生成器和随机浮点数生成器之间感到困惑.在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.  
Run Code Online (Sandbox Code Playgroud)

认为R - a为R1.如何生成R1使得R1的范围从0到(ba)?

R1 = rand(0, 1) * (b-a)   // by apply rule 2.
Run Code Online (Sandbox Code Playgroud)

现在用R替换R1 - a

R - a = rand(0,1) * (b-a)    ==>   R = a + rand(0,1) * (b-a)
Run Code Online (Sandbox Code Playgroud)

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

我们有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
Run Code Online (Sandbox Code Playgroud)

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