n个骰子的点数

描述:

n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。

 

 

 

 

转移方程:

k表示骰子个数,n表示k个骰子的点数和

                |            =F(k-1, n-6) + F(k-1, n-5) + F(k-1, n-4) + F(k-1, n-3) +F(k-1, n-2) + F(k-1, n-1)        对于 k > 0,k <= n <= 6*k

F(k, n) =  | 

                |            = 0              对于 n < kor n > 6*k

 

初始化k=1,F(1,1)=F(1,2)=F(1,3)=F(1,4)=F(1,5)=F(1,6)=1

 

代码:

constint FACE_NUM = 6;

voidPrintSumProbabilityOfDices(int number)

{

    // number超过20的话,会导致概率无法用double表示,因为double能表示的精度只有15~16位有效数字

    if(number > 20)

    {

        cout << "error\n";

    }

    double pro[FACE_NUM * 20 + 1] = {1, 0};

    int i, j, k;

    for(i = 1; i <= number; i++)

    {

        for(j = FACE_NUM * i; j >= i;j--)

        {

            pro[j] = 0;

            for(k = 1; k <= 6&& j >= k; k++)

            {

                pro[j]+= pro[j - k] / 6;

            }

        }

        for(j = i - 1; j >= 0; j--)

        {

            pro[j] = 0;

        }

    }

    double dj;

    for(i = number, dj = 0; i <= FACE_NUM *number; i++)

    {

        cout << "number: "<< i << " probability:" << pro[i] << endl;

        dj += pro[i];

    }

    cout << dj << endl;

}

intmain(int argc, char *argv[])

{

    int n;

    cin >> n;

    PrintSumProbabilityOfDices(n);

}

 

你可能感兴趣的:(n个骰子的点数)