2010-10-13 101 views
1

给定两个随机整数发生器,一个产生1到7,另一个产生1到5,你如何产生一个随机的整数发生器,产生1到13之间?我尝试过以各种方式解决这个问题,但我一直没有能够提出一个解决方案,以相等或几乎相等的概率生成1到13的数字。随机数发生器的组合

+0

尝试:http://stackoverflow.com/questions/1268025/using-one-probability-set-to -generate-another – Jander 2010-10-13 06:32:40

回答

1

使用前两个答案Expand a random range from 1–5 to 1–7,我想出了以下内容。有可能是一个更有效的方法来做到这一点(也许使用1-5生成器?),但这似乎工作。

优化压实

var j; 
    do { 
     j = 7 * (rand7() - 1) + rand7(); // uniformly random between 1 and 49 
    } while (j > 39); 
    // j is now uniformly random between 1 and 39 (an even multiple of 13) 
    j = j % 13 + 1; 

优化可理解

var v = [ 
    [1, 2, 3, 4, 5, 6, 7], 
    [8, 9, 10, 11, 12, 13, 1], 
    [2, 3, 4, 5, 6, 7, 8], 
    [9, 10, 11, 12, 13, 1, 2], 
    [3, 4, 5, 6, 7, 8, 9], 
    [10, 11, 12, 13, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0] 
]; 
var j = 0; 
while (j == 0) { 
    j = v[rand7() - 1][rand7() - 1]; 
} 
+0

可爱的解决方案,非常感谢。 :) – Anand 2010-10-13 08:00:26