有人问我产生之间的随机数a和b,包容,使用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)
我的答案是否正确?
我认为你在随机整数生成器和随机浮点数生成器之间感到困惑.在C++中,rand()生成0到32K之间的随机整数.因此,为了生成1到10的随机数,我们写rand()%10 + 1.因此,要生成从整数a到整数b的随机数,我们写rand()%(b - a + 1)+一个.
面试官告诉你,你有一个从0到1的随机发生器.它意味着浮点数发生器.
如何以数学方式得到答案:
例如:生成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