我被要求使用a
生成b
和random(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}}
我的答案是否正确?
答案 0 :(得分:8)
我认为你在随机整数生成器和随机浮点数生成器之间感到困惑。在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.
将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
- 我假设这是一种获取任意值的奇怪方式,或者是其他意图?)为零(比如a
和b
给出的范围是(-5, 0)
),那么你的结果肯定是不均匀的。结果始终为b
。
最后,我当然不是统计学家,但在你的最终答案中(从random(1,7)
生成random(1.5)
),我很确定A+B+C
将是非统一的因此会在结果中引入偏见。
答案 5 :(得分:0)
我认为对此有一个更好的答案。有一个值(概率->零)溢出,因此存在模数。
在间隔[0,1]中获取一个随机数 x
。
将可以作为参数的upper_bound加1。
计算 (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)并再次绑定,直到出现适当范围内的数字。
显然,当我们假设我们想要随机整数时,这是正确的。
但是要获得随机浮点数,我们需要相应地修改范围,如上文所述。