不同类型骰子的骰子总概率

2023-12-25

我目前正在开发一个java应用程序,我需要计算滚动各种骰子的每个总和的概率。我支持的骰子类型有 d4(4 面骰子)、d6(6 面骰子)、d8(8 面骰子)、d10、d12 和 d20。用户将能够输入他们想要在计算中使用的每种骰子的数量。例如,用户可以输入6 d6 和4 d4。

根据给定的信息(每种类型的骰子数量),我希望计算每个可能的总和可以滚动的概率。然后,我将使用此信息创建一个图表,显示所提供的所选骰子组合的概率分布。

该应用程序是用 Java 编写的。

我目前所处的位置是我有一个函数,可以计算仅使用一种尺寸的骰子的特定总和的概率

/*
    Recursively calculates the probability of rolling a particular number
    when rolling multiple dice of one type
    @param dice Number of dice
    @param seekedValue Value whose probability is being calculated
    @param sides Number of sides on the type of die
     */
    private double diceProb(int dice, int seekedValue, int sides){
        if (dice == 0){
            if (seekedValue == 0){
                return 1.0;
            } else {
                return 0.0;
            }
        } else {
            double sum = 0;
            for (int i = seekedValue - sides; i < seekedValue; i++){
                sum += diceProb(dice -1, i, sides) / sides;
            }
            return sum;
        }

    }

然后我使用这段代码来查找所有可能的概率

/*
Variable Explanations:
diceEntries: This array list contains the number of each dice supplied by the user.
It is ordered by number of sides, with d4 at the beginning and d20 at the end
diceValues: This array contains the sides of the dice types
probArray: this array list will contain the probabilities of each sum possible
min: the minimum sum  possible
max: the maximum sum possible
*/
ArrayList<Integer> diceEntries
ArrayList<Float> probArray = new ArrayList<>();
int[] diceValues = {4,6,8,10,12,20};
float prob = 0;
for (int i = min; i <= max; i++){
    for (int j = 0; j <= 5; j++) {
        prob = (float) diceProb(diceEntries.get(j), i, diceValues[j]);
        if (prob != 0) {
            probArray.add(prob);
        }
    }
}

我当前的代码只能处理一种尺寸的骰子,即只能处理 d6 或 d4,而不能处理它们的混合。

如果社区能够提供一些指导,我们将不胜感激。我也对过度的方法持开放态度。例如,我读过生成函数可能是执行此操作的更好方法,但我的组合统计数据有点弱,如果有人确实有一种编码方法,那么很高兴看到它。

非常感谢大家


暴力方法的另一个条目,使用整数(骰子面)列表来处理多种骰子类型。优点是,如果你想要很多概率,你可以运行一次,然后查询各种概率。缺点是作为一种蛮力方法,仅获得单个概率的效率非常低。

public int[] probs;

public void genRolls(int sum, List<Integer> sides)
{
    if (sides.size() == 0)
    {
        probs[sum]++;
        return;
    }
    int top = sides.get(0);
    for (int x = 1; x <= top; x++)
        genRolls(sum+x, sides.subList(1, sides.size()));
}

public void diceprob(int target, List<Integer> sides)
{
    int maxval = 0;
    double possibilities = 1;
    for (Integer i : sides)
    {
        maxval+= i;
        possibilities *= i;
    }
    probs = new int[maxval+1];
    genRolls(0, sides);
    System.out.println("Probability is " + (probs[target]/possibilities));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不同类型骰子的骰子总概率 的相关文章

随机推荐