n個骰子的點數

2021-10-12 03:12:58 字數 1291 閱讀 5041

求s所有值出現的概率

n個骰子的最大值為6n,最小值為n,n個骰子排列組合為6^n,統計每個點數的次數,然後除以6的n次方才能得到概率

如果遞迴來思考,把骰子分成兩堆,一堆為1個,另一堆為n-1個,所以計算這個骰子分別出現1到6再加上f(n-1)的和s。

定義乙個長度為6n-n+1的陣列來儲存和s的次數,然後遞迴遍歷每乙個和s,出現則加上。最後迴圈陣列算出概率。

遞迴求和的過程是每乙個和s都是由所有n個骰子相加得到的,一開始和s等於的是第乙個單獨的骰子的點數,然後加上下乙個骰子的點數。一直迴圈到只剩最後乙個骰子算出這種情況的s,並在陣列的這個位置加1。

第二種求的方法是利用迴圈。用兩個陣列來儲存骰子點數的每個s出現的次數。首先是只有乙個骰子,此時就是和為1到6的次數都為1,迴圈賦值給第乙個陣列來表示前乙個骰子儲存的值。

然後從i等於2也就是有兩個骰子時開始算一直迴圈到n個骰子。在迴圈中給第二個陣列賦值當前骰子的值從0到6k,從0到i這段次數都為0(因為有兩個骰子,所以這段不可能有次數),從i到6k這一段,此時的和s可以由上一輪中arr[i-1],arr[i-2]一直到arr[i-6]加起來得到,因為這都是它可能出現的次數。

在賦值完這個之後在下一次迴圈中把這個陣列當成上次的陣列,把第乙個陣列當成上一次的陣列進行賦值。就是弄乙個arr來儲存,用flag和1-flag來表示此時操作的是哪個陣列。

public class n個骰子的點數

int[

] probabilities = new int[2]

[sdicemaxvalue * dicenumber +1]

; int flag =0;

// 只有乙個骰子的時候我們將各個和的值都初始化為1

for(int i =

1; i <= sdicemaxvalue; i++)

for(int k =

2; k <= dicenumber; k++)

for(int i = k; i <= sdicemaxvalue * k; i++)

} flag =

1- flag;

} double total = math.

pow(sdicemaxvalue, dicenumber)

;for

(int i = dicenumber; i <= sdicemaxvalue * dicenumber; i++)

} public static void main

(string[

] args)

}

n個骰子的點數

把n個骰子扔在地上,所有骰子朝上的一面的點數之和為s。輸入n,列印出s的所有可能的值和出現的概率。1 基於迴圈求骰子點數 2int g maxvalue 6 骰子的點數個數 3void printprobability int number number 為骰子個數49 int pprobabili...

n個骰子的點數

題目 把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。方法一 遞迴 思路 設n個骰子某次投擲點數和為s的出現次數是f n,s 那麼,f n,s 等於n 1個骰子投擲的點數和為s 1 s 2 s 3 s 4 s 5 s 6時的次數的總和 f n s f n...

n個骰子的點數

題目 把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。方法一 遞迴 思路 設n個骰子某次投擲點數和為s的出現次數是f n,s 那麼,f n,s 等於n 1個骰子投擲的點數和為s 1 s 2 s 3 s 4 s 5 s 6時的次數的總和 f n s f n...