1. 程式人生 > >n個骰子的點數

n個骰子的點數

把n個骰子扔在地上,所有骰子朝上一面的點數之和為s,輸入n,打印出s的所有可能出現的概率

思路:遞迴一般是自頂向下的分析求解,而迴圈則是自底向上,佔用更少的空間和更少的時間,效能較好。定義一個二維陣列,第一次擲骰子有6種可能,第一個骰子投完的結果存到probabilities[0];第二次開始擲骰子,在下一迴圈中,我們加上一個新骰子,此時和為n的骰子出現次數應該等於上一次迴圈中骰子點數和為n-1,n-2,n-3, n-4,n-5,n-6的次數總和,所以我們把另一個數組的第n個數字設為前一個數組對應n-1,n-2,n-3,n-4,n-5,n-6之和

public void printProbability(int number) {
    if(number<1)
        return ;
    int g_maxValue=6;
    int[][] probabilities=new int[2][];
    probabilities[0]=new int[g_maxValue*number+1];
    probabilities[1]=new int[g_maxValue*number+1];
    int flag=0;

    // 當第一次拋擲骰子時,有6種可能,每種可能出現一次
    for(int i=1;i<=g_maxValue;i++)
        probabilities[0][i]=1;

    //從第二次開始擲骰子,假設第一個陣列中的第n個數字表示骰子和為n出現的次數,
    for(int k=2;k<=number;++k) {
        for(int i=0;i<k;++i)
            // 第k次擲骰子,和最小為k,小於k的情況是不可能發生的,令不可能發生的次數設定為0!
            probabilities[1-flag][i]=0;
        // 第k次擲骰子,和最小為k,最大為g_maxValue*k
        for(int i=k;i<=g_maxValue*k;++i) {
            // 初始化,因為這個陣列要重複使用,上一次的值要清0
            probabilities[1-flag][i]=0;
            for(int j=1;j<=i && j<=g_maxValue;++j)
                probabilities[1-flag][i]+=probabilities[flag][i-j];
        }
        flag=1-flag;
    }

    double total=Math.pow(g_maxValue, number);
    for(int i=number;i<=g_maxValue*number;i++) {
        double ratio=(double) probabilities[flag][i]/total;
        System.out.println(i);
        System.out.println(ratio);
    }
}

相關推薦

N點數之和的分佈

將N個均勻的骰子,扔在地上,求點數之和的分佈。 因為是分佈,自然是求N個篩子之和等於M的概率,p(m) p(m) = fre(n,m)/sum fre(n,m)是指n個骰子扔出m個點數的 總的可能情況,這個就相當於組合數,只是限制了每個骰子的點數在1-6之間。 sum是n

n點數和及各自出現的概率

題目:把n個骰子扔在地上,所有骰子朝上一面的點數之和為S。輸入n,打印出S的所有可能的值出現的概率。 這道演算法題可採取動態規劃法來求解。鑑於《劍指Offer》中對該題的解法晦澀難懂,尤其是程式碼,也沒有指明其解題的思路本質上就是動態規劃,所以提出自己的理解和

《劍指offer》 面試題43 n點數 (java)

r+ nal ret 次循環 分而治之 源碼 ava 面試 ble 引言:寫這篇文章的初衷只是想做個筆記,因為這道題代碼量有點大,有點抽象,而書上並沒有詳細的註釋。為了加深印象和便於下次復習,做個記錄。 原題:把n個骰子扔到地上,所有骰子朝上一面的點數之後為s. 輸入n,打

劍指Offer面試題43(Java版):n點數

pac pos max mod ins pri class pro bili 題目:把n個骰子仍在地上。全部骰子朝上一面的點數之和為s,輸入n,打印出s的全部可能的值出現的概率。 解法一:基於遞歸求骰子的點數,時間效率不夠高 如今我們考慮怎樣統計每個點數出現的次數。要向

n點數(Java實現)

本題為劍指offer面試題43 沒有找到牛客網的測試例題 題目:把n個骰子仍在地上,所有骰子朝上一面的點數之和為s,輸入n,打印出s的所有可能的值出現的概率。 解法一:基於遞迴求骰子的點數,時間效率不夠高 現在我們考慮如何統計每一個點數出現的次數。要向求出n個骰

n點數以及出現概率

//把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,打印出s的所有可能 //的值出現的概率。 #include "stdio.h" #include "cmath" #include "helper.h" using namespace std; //方法1:

n點數

把n個骰子扔在地上,所有骰子朝上一面的點數之和為s,輸入n,打印出s的所有可能出現的概率 思路:遞迴一般是自頂向下的分析求解,而迴圈則是自底向上,佔用更少的空間和更少的時間,效能較好。定義一個二維陣列,第一次擲骰子有6種可能,第一個骰子投完的結果存到probabilitie

【劍指offer】面試題43:n點數

第一種思路是,每個骰子的點數從最小到最大,假設為1-6,那麼所有的骰子從最小1開始,我們假設一種從左向右的排列,右邊的最低,索引從最低開始,判斷和的情況。 def setTo1(dices, start, end): for i in range(start, end)

劍指offer:n點數(java)

題目:把n個骰子仍在地上,所有骰子朝上一面的點數之和為s,輸入n,打印出s的所有可能的值出現的概率。     骰子一共6個面,每個面上都有一個點數,對應的是1-6之間的一個數字。所以n個骰子的點數和的最小值是n,最大值為6n.另外根據排列組合的知識,我們還知道n個骰子的所有

n點數和出現的概率-動態規劃

這幾天在看劍指offer的時候發現,求n個骰子個點數和這個問題是發現書中講的不是很清楚,於是查詢資料,覺得下面講的比較透徹,記錄如下: 題目:把n個骰子扔在地上,所有骰子朝上一面的點數之和為S。輸入n,打印出S的所有可能的值出現的概率。 宣告思想非原創!只因動態規劃思

n點數之和的概率

n個骰子的點數。把n個骰子扔在地上,所有骰子朝上一面的點數之和為S。輸入n,打印出S的所有可能的值出現的概率。 思想:F(n,s) = F(n-1,s-6)+F(n-1,s-5)+F(n-1,s-4)+F(n-1,s-3)+F(n-1,s-2)+F(n-1,s-1); #i

面試題43: n點數

原題:把n個骰子扔到地上,所有骰子朝上一面的點數之後為s. 輸入n,打印出s所有可能的值出現的概率。(每個骰子6個面,點數從1到6) 解法一:基於遞迴,時間效率不高 遞迴的思想一般是分而治之,把n個骰子分為第一個和剩下的n-1個。先計算第一個骰子每個點數出現的次數,再

n點數和出現的概率- 動態規劃

題目:把n個骰子扔在地上,所有骰子朝上一面的點數之和為S。輸入n,打印出S的所有可能的值出現的概率。 宣告思想非原創!只因動態規劃思想的使用很好,記下! 分析:動態規劃就是分階段考慮問題,給出變數,找出相鄰階段間的關係。具體定義給忘了。 1.現在變數有:骰子個數,點

《劍指offer》:[43]N點數

題目:把N個骰子扔在地上,所有骰子朝上一面的點數之和為S,輸入N,打印出S的所有可能的值出現的概率。 分析:對於6點的N個骰子來講,其和S的最小值為N,最大值為6N。要得到和S出現的概率,就得得到和S出現的次數,然後用某一S出現的次數/S的所有可能性=S出現的概率。對於骰

劍指offer 面試題43—n點數

題目: 把n個骰子扔在地上,所有骰子朝上一面的點數之和為S。輸入n,打印出S的所有可能的值出現的概率。 解法一:遞迴        玩過麻將的都知道,骰子一共6個面,每個面上都有一個點數,對應的數字是1到 6之間的一個數字。所以,n個骰子的點數和的最小值為n,最大值為6n

《劍指offer》第六十題(n點數

original double 出現 ostream 使用 col ren str current // 面試題60:n個骰子的點數 // 題目:把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,打印出s // 的所有可能的值出現的概率。 #incl

點數之和概率

題目出自美團點評線上筆試題,求三個骰子的點數之和概率最大的是? 思路:三個骰子點數之和的範圍是3~18,越靠近兩邊出現的概率越小,因此點數和概率最大的情況應該出現在中間位置。計算中間9,10,11,1

LightOJ 1248 - Dice (III) 給一個質地均勻的n, 求投擲出所有點數至少一次的期望次數。(概率)

pri std printf 有一個 return main tdi algorithm style 題意:http://www.lightoj.com/volume_showproblem.php?problem=1248   投擲出第一個未出現的點數的概率為n/n =

使用pygal統計投擲N之後點數的分布情況

可視化 clas file gpo mes 計算 result 完整 次數 一、環境信息 python版本:2.7.13 pygal版本:2.4.0 pygal安裝:pip install pygal 從python官方完整下載的最新的python版本自帶pip 二、具

【劍指Offer學習】【面試題43 : n 點數

題目:把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,打印出s 的所有可能的值出現的概率。 解題思路 解法一:基於通歸求解,時間效率不夠高。   先把n個骰子分為兩堆:第一堆只有一個,另一個有n- 1 個。單獨的那一個有可能出現從1 到