从具有不同范围的给定随机数生成器方法创建随机数生成器方法

时间:2015-05-30 20:11:28

标签: algorithm random random-sample

我想使用给定的随机数生成器方法创建一个随机数生成器。

  

给定一个函数randK(),它返回一个从1到1的随机数   k,创建一个函数randN(),它返回一个从1到n的随机数   等概率。

其中k可以小于或大于n (k<n or k>n)

我理解,如果(k > n)我们可以继续调用randK()直到它返回(value <= n)

  1. 但是会保留equal probability属性。?
  2. 还有(k<n)
  3. 的情况

    `

2 个答案:

答案 0 :(得分:2)

1)是的,1k之间的所有数字都有相同的概率,而且概率为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的数字。