math – 根据一系列硬币翻转生成0到9之间的随机数

我可以使用什么方法来最小化从0到9生成均匀分布数字所需的硬币翻转量?

我做了一些研究,但我无法弄清楚如何使其适应这个特定的问题:

> Expand a random range from 1–5 to 1–7
> https://www.quora.com/How-do-I-use-a-fair-6-sided-die-to-generate-a-random-number-from-1-to-20-with-each-outcome-occurring-with-the-same-probability
> https://cs.stackexchange.com/questions/570/generating-uniformly-distributed-random-numbers-using-a-coin

最佳答案 在掷硬币时你需要至少10种可能的组合.如果硬币被翻转4次,我们将有16个排列.因此,所需的最小翻转次数为4.

通过参考reference中提到的算法,我们可以按如下方式实现该问题.

变量randNum返回0-9之间的均匀分布的随机数.

函数rand2通过为T和H分配0和1值来模拟硬币翻转练习,反之亦然.

int[][][][] fourDimArr = { { { {1, 2},{3, 4} }, {{5, 6} ,{7, 8} } }, { { {9,10},{0,0} }, { {0,0},{0,0} } } };
int result = 0;
    while (result == 0)
    {
        int i = rand2();
        int j = rand2();
        int k = rand2();
        int l = rand2();
        result = fourDimArr[i][j][k][l];
    }
int randNum = result-1;

James K Polk在下面的评论中提出了一种更简单,更直观的实施方案.它涉及使用硬币翻转的结果作为四位数的位.

通过拒绝值> = 10,我们将生成0-9之间的均匀分布的随机数.有关实现,请参阅下面的代码段.

int result = 11;
        while(result>=10){
            result = 0;
            for(int j = 0; j < 4; j++){
                result = (result<<1)|rand2();
            }
        }
randNum = result;

rand2的示例实现如下:

private static int rand2() {
    if(Math.random()>0.5)return 1;
    return 0;
}

注意:所需的最小翻转次数为4.在最坏情况下所需的翻转次数仍然是无限的,但这种情况从未出现过.

点赞