美文网首页
n枚骰子点数和概率问题

n枚骰子点数和概率问题

作者: 这个昵称起的不认真 | 来源:发表于2020-07-10 00:25 被阅读0次

n枚骰子点数和概率问题

随意投掷n枚骰子,求每一种骰子点数和出现的概率。

设n枚骰子点数的和k出现数目为f(n,k),概率
P(n,k) = \frac{f(n,k)}{6^n}

1. 当n=1时

当n=1时,每一个值出现的概率均等,都是1/6,即:
f(1,1)=f(1,2)=f(1,3)=f(1,4)=f(1,5)=f(1,6)=1\\ P(1,1)=P(1,2)=P(1,3)=P(1,4)=P(1,5)=P(1,6)=\frac{1}{6}

2. 当n=2时

当n=2时,可以看作时是第二枚骰子将第一枚骰子的所有可能重复一次,但是也将骰子值向后移动第二个骰子的点数,具体操作如下表所示(空位值为0):

- 1 2 3 4 5 6 7 8 9 10 11 12
n=1 1 1 1 1 1 1 0 0 0 0 0 0
1 1 1 1 1 1 1
2 1 1 1 1 1 1
3 1 1 1 1 1 1
4 1 1 1 1 1 1
5 1 1 1 1 1 1
6 1 1 1 1 1 1
n=2 - 1 2 3 4 5 6 5 4 3 2 1

观察上表可知:

k=2只有第二枚骰子为1这一种可能,

k=3有2+1和1+2这两种可能

k=4有3+1,2+2,1+3这三种可能

...

观察两个骰子和12的那一列,和为12的可能有1+11,2+10,3+9,4+8,5+7,6+6,这6种可能,但是在一枚骰子时,k=11,10,9,8,7都是不可能的所以设置为0

所以有
f(2,k) = \sum_{i=k-6}^{k-1} f(1,i) \quad ,\quad k=2,3,...,12
其中不存在的f(1,i)设置为0

由此可知

3. 当筛子数为n时

设n枚骰子的和为k对应的数目为f(n,k)则有:
f(n,k) = \sum_{i=k-6}^{k-1}f(n-1,i)\quad , \quad k=n,n+1,\cdots,6n\\ f(1,i)=1\quad,\quad i=1,2,3,4,5,6
再根据f(n,k)计算概率P(n,k)

4. java实现

根据1、2、3可知算法仅需要一维数组就可以存储结果,但此时前面的结果会影响后面的结果,所以先计算大值的出现次数,然后再小值的次数

class Solution{
    public double[] getNP(int n){
        double total = Math.pow(6, n); // 总次数
        int[] valTotal = new int[6 * n + 1];
        double[] res = new double[5 * n + 1];
        for (int i = 1; i <= 6; i++) {
            valTotal[i] = 1; // 赋初值
        }
        for (int i = 2; i <= n; i++) {
            for (int j = 6 * i; j >= i; j--) {
                valTotal[j] = 0;
                for (int k = j - 1; k >= j - 6; k--) {
                    if (k >= 0)
                        valTotal[j] += valTotal[k];
                }
            }
            for (int j = i - 1; j >= 0; j--) {
                valTotal[j] = 0; // 清除无效数据,否则会影响后续的计算
            }
        }
        for (int i = 0; i < 5 * n + 1; i++) {
            res[i] = valTotal[i + n] / total;
        }
        return res;        
    }
}

相关文章

网友评论

      本文标题:n枚骰子点数和概率问题

      本文链接:https://www.haomeiwen.com/subject/jhnycktx.html