我是一個高中計算機科學的學生,今天我得到了一個問題:計算路數推出一定數量
程序說明:有骰子玩家之間的信念,在投擲三個骰子十個比九個更容易得到。你能寫一個證明或反駁這種信念的程序嗎?
有計算機計算所有可能的方式三個骰子可以 拋出:1 + 1 + 1,1 + 1 + 2,1 + 1 + 3等添加了每一種 可能性,看看有多少給出九個結果以及有多少個給定十個。如果再給十個,那麼這個信念就證明了。
我很快就摸索出蠻力的解決方案,因爲這樣
int sum,tens,nines;
tens=nines=0;
for(int i=1;i<=6;i++){
for(int j=1;j<=6;j++){
for(int k=1;k<=6;k++){
sum=i+j+k;
//Ternary operators are fun!
tens+=((sum==10)?1:0);
nines+=((sum==9)?1:0);
}
}
}
System.out.println("There are "+tens+" ways to roll a 10");
System.out.println("There are "+nines+" ways to roll a 9");
這工作得很好,和蠻力解決方案是什麼,老師要我們做的。然而,它不能縮放,我試圖找到一種方法來製作一個算法,該算法可以計算滾動 n骰子以獲得特定數字的方法數量。因此,我開始生成一些方法來獲得每個總和 n骰子。有1死,每個顯然有1個解決方案。然後我通過蠻力計算了2個和3個骰子的組合。這些是2:
有1種方式滾2
有2種方式滾動3
有3種方法對卷4
有4種方式滾5
有有5種方法對卷6
有6點的方式來滾7
有5種方法來滾8
有4種方式滾9
有3種方法對卷10
有2種方式滾動一個11
有1種方法可以滾動12
看起來很簡單;它可以用一個簡單的線性絕對值函數來計算。但事情開始變得棘手。以3:
有1種方式滾3
有3種方法對卷4
有6點的方式來滾5
有10種滾6
有15個方式來滾7
有21點的方式來滾8
有25種方式滾動9
有27種方式滾10
有27種方式滾11
有25點的方式滾動a 12
有21種方法可以滾動13
再是15點的方式來滾14
有10種滾15
有6點的方式來滾16
有3種方法對卷17
有1種方式滾18
所以我看看,我想:酷,三角數字!然而,我注意到那些討厭的25和27。所以它顯然不是三角形數,但仍然是一些多項式展開式,因爲它是對稱的。
所以我帶到谷歌,我遇到了this page,詳細說明了如何用數學來做到這一點。使用重複的派生或擴展可以很容易地找到它(雖然很長),但對於我來說編程會更困難。我不太明白第二和第三個答案,因爲我以前從未在我的數學研究中遇到這種符號或那些概念。有人能解釋我怎麼可以寫一個程序來做到這一點,或解釋在該頁面上給出的解決方案,我自己理解組合?
編輯:我正在尋找解決這一數學方法,給出了一個確切的理論值,而不是通過模擬骰子
這似乎有點偏離主題,因爲您正在尋找一種數學解決方案(大概),一旦您知道自己在做什麼,就很樂意編寫代碼。因此,它的核心似乎並不是一個真正的編程問題。 –