Math 基于一系列抛硬币生成从0到9的随机数

Math 基于一系列抛硬币生成从0到9的随机数,math,random,Math,Random,我可以使用什么方法来最小化生成从0到9的均匀分布数字所需的投币量 我已经做了一些研究,但是我还没有弄清楚如何使它适应这个特定的问题: 在掷硬币时,您至少需要10种可能的组合。如果硬币翻转4次,我们将有16个排列。因此,所需的最少翻转次数为4次 通过参考您的中提到的算法,我们可以实现如下问题 变量randNum返回0-9之间均匀分布的随机数 函数rand2通过将0和1的值指定给T和H或反之亦然来模拟抛硬币练习 int[][][][] fourDimArr = { { { {1, 2},{3

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

我已经做了一些研究,但是我还没有弄清楚如何使它适应这个特定的问题:


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

通过参考您的中提到的算法,我们可以实现如下问题

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

函数
rand2
通过将0和1的值指定给T和H或反之亦然来模拟抛硬币练习

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;
下面的评论中建议使用更简单、更直观的实现。它包括使用硬币翻转的结果作为四位数字的位

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

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

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

平均最小化还是最小化上限?@JoachimIsaksson平均翻转次数是我所想的。然后,第一种最有效的方法是使用10次翻转生成一个二进制数999,并将3位数字用作该范围内的3个随机数。这是一个非常复杂的变化,简单地将四次翻转中的每一次翻转作为四位数字中的一位;如果小于10,则接受结果,否则拒绝结果并重新翻转。
private static int rand2() {
    if(Math.random()>0.5)return 1;
    return 0;
}