参考:
https://www.jianshu.com/p/5fc41ff88c3a
题目要求:
把n个骰子仍在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值的出现概率。
思路:
n个骰子,所有可能出现的点数和 就是 1~6*n.
题目要求的是概率,因此就要求 每种点数可能出现的次数。
假设当前 有 m个骰子,那么点数 和为s 的求法就是 m-1个骰子时,s-1,s-6情况的点数和。
开二维数组。第一维度2即可。
初始化数组,骰子个数为1,出现1 ~ 6的次数 就为1次,因为大家的概率是相同的。
package jianZhi;
public class Demo01 {
// 计算的是次数
public static void printProbablity(int number)
{
if (number<=0)return;
int[][] res = new int[2][6*number+1];
for (int i =1;i<=6;i++)
{
res[1][i] = 1;
}
for (int n = 2;n<=number;n++)
{
for (int i=n;i<n*6+1;i++) // !!!!!!!!!!!
{
for (int j=i-1;j>=i-6;j--)
{
if (j>0) // !!!!!!!!!!!!!!
res[n%2][i] += res[(n-1)%2][j];
}
}
}
double sum = 0;
for (int i=number;i<number*6+1;i++) // !!!!!!!!!!!!!
{
sum += res[number%2][i];
}
// double p;
System.out.println("number: "+ number);
for (int i=1;i<number*6+1;i++)
{
System.out.println("probability " + i + ":" + res[number%2][i]/sum);
}
}
public static void main(String[] args) {
printProbablity(2);
printProbablity(0);
printProbablity(11);
}
}