- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在开发一个 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);
}
}
}
我当前的代码只能处理一种尺寸的骰子,即只能处理 d6s 或 d4s 而不是它们的混合。
如果社区可以提供一些指导,将不胜感激。我也对过度方法持开放态度。例如,我读过生成函数可能是更好的方法,但我的组合统计有点薄弱,如果有人确实有一种编码方法,我很高兴看到它。
非常感谢大家
最佳答案
蛮力法的另一个条目,使用整数列表(骰子边)来处理多种骰子类型。好处是如果你想要很多概率,你可以运行一次然后查询各种概率。缺点是作为一种蛮力方法,仅获得单一概率的效率非常低。
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));
}
关于java - 不同类型骰子的骰子总和概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29854866/
我刚刚向自己介绍了 WebGL 和 Threejs,作为开始,我正在尝试创建一个 3D 骰子。我已经到了创建立方体的地步,但我真的不知道如何在立方体的面上放置数字,我能找到的只是如何更改颜色。我已经查
这就是我现在得到的...... var max = 7; var min = 1; $('#dice').click(function() { random = Math.floor(Math.r
我是 Unity 的新手,一直在尝试掷骰子。我遇到了一组教程,它们允许我创建一个 3d 模具(模具使用 Rigidbody 和 Mesh Collider)并编写脚本使其在空格键上滚动,如下所示: 骰
我是 JavaScript 新手,我需要一些想法/帮助来了解如何使我的脚本正常工作。所以我们的想法是,你掷两个骰子,通过按下“掷骰子”按钮然后按下重置按钮来重置整个 HTML 中的所有内容。 所以事情
我正在尝试构建一个掷骰子游戏,如果计算机自动掷出一对骰子,并且如果 cpu 掷出 7 或 11,则用户获胜。然而,如果用户掷出 2、3 或 12,他们将自动失败。如果用户滚动任何其他数字(4、5、6、
背景 如此处所述http://www.ericharshbarger.org/dice/#gofirst_4d12 , “先走”骰子是一组四个骰子,每个都有唯一的编号,因此: 任何两个或更多骰子都不会
我是一名优秀的程序员,十分优秀!