我想使用给定的随机数生成器方法创建一个随机数生成器。
给定一个函数randK(),它返回一个从1到1的随机数 k,创建一个函数randN(),它返回一个从1到n的随机数 等概率。
其中k
可以小于或大于n
(k<n or k>n)
。
我理解,如果(k > n)
我们可以继续调用randK()直到它返回(value <= n)
。
equal probability
属性。?(k<n)
?`
答案 0 :(得分:2)
1)是的,1
到k
之间的所有数字都有相同的概率,而且概率为1 / k
(不是1 / n
),所以一切都是同样可能的(同样,如果k - n
为高,那么 fn()中 f()的调用次数可能会增加。)
2)创建值为(f(), f(), ..., f())
的 x-tuple ,其中 x 是满足以下方程式的较小整数: k x &gt; = n
我们只关心 x ,使 k x &gt; n ,这会将问题转回案例1(k > n
)。如果生成的x元组在前n个元组之外,则重新开始。
示例:鉴于 f()返回[1, 5]
中的数字(同样可能),您要创建 fn()返回[1, 10]
中的数字(同样可能)。
满足 5 x &gt; = 10 的第一个整数 x 是 x = 2 ,(25 &gt; = 10)。
然后您的 x-tuple 的格式为(f(), f())
(只是一个元组),调用函数 f()两次并应用案例1:< / p>
(1,1) = 1, (1,2) = 2, (1,3) = 3,
(1,4) = 4, (1,5) = 5, (2,1) = 6,
(2,2) = 7, (2,3) = 8, (2,4) = 9 and (2,5) = 10
如果你得到其他15个元组中的一个[(3,1),(3,2),(3,3),(3,4),(3,5),(4,1),( 4,2),(4,3),(4,4),(4,5),(5,1),(5,2),(5,3),(5,4),(5, 5)]再次重复算法,直到得到前10个元组中的一个。
10个元组出现的概率相同,为1/25。
答案 1 :(得分:1)
这适用于k> 1的情况。 ñ。逻辑来自此链接 - http://www.geeksforgeeks.org/generate-integer-from-1-to-7-with-equal-probability/。考虑randn生成从1到n的数字,randk生成从1到k的数字。
int i = randn*n + randn - n;
int j = n*n/k;
while ( i < j*k + 1){
i = randn*n + randn - n;
}
return i%k + 1;
这应该以相同的概率生成从1到k的数字。