[問題] 扔n次骰子,各種點數和的機率

看板C_and_CPP作者 (無良記者)時間11年前 (2015/01/18 19:32), 11年前編輯推噓4(4024)
留言28則, 7人參與, 最新討論串1/6 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 2013 問題(Question): 我不太確定這種問題能否在這邊發問,不過還是會試著盡量詳述我的問題與想法 這次有個功課,是要寫一個能夠計算扔n次骰子,出現的點數和的機率 比方說,扔一次骰子,點數會有1~6,機率各是1/6 扔兩次骰子,點數會從2~12,機率則會分別是{1,2,3,4,5,6,5,4,3,2,1}/36 依此類推 我最一開始的想法很直白,就是寫一個多層的巢狀迴圈來做這件事情 像是扔兩次骰子的情況下: int a[11]; //然後把每個位置都初始為0 for(int i = 1; i <= 6; i++) for(int j = 1; j <= 6; j++) { a[i + j]++; } 扔三次骰子的話,則再多加一層以k為變數驅動的for迴圈,然後變成a[i + j + k]++; 依此類推,就可以算出每種點數和的個別次數,進而得知每種點數和的機率 但是現在的麻煩就是:n是使用者給定的,而n的大小關係到迴圈的層數 我不知道該怎麼隨著n的變化而增減迴圈層數,也不知道C++有沒有辦法做到這件事情 另一個有想到的作法是用遞迴,但是我的遞迴能力不怎麼樣,不知道該怎麼實現這個想法 請問版上的板友們能夠提供我一些可以實現此想法的建議或提示嗎? 或者能夠指引我另一條路? 感謝 -- 到那時,在壁爐邊,當孫子坐在某位老人的膝蓋上,問道:「爺爺,你在亡靈天災入侵的 時候幹什麼呢?」 而他不用尷尬地干咳一聲,把孫子移到另一個膝蓋上,吞吞吐吐地說 :「啊……爺爺我當時在清淨農場挖牛糞。」與此相反,他可以直盯著他的眼睛理直氣壯 地說: 「孫子,爺爺我當年在立法院議場和那個狗娘養的三百暴民並肩作戰!」 ~《太陽花全書》 第一章第二節 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.27.14.213 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1421580761.A.7BC.html

01/18 19:43, , 1F
2~12的機率有錯哦 1.2....6....2.1
01/18 19:43, 1F
對耶XD

01/18 20:20, , 2F
函數包迴圈再遞迴即可
01/18 20:20, 2F

01/19 00:26, , 3F
應該是DP找零錢問題的延伸?
01/19 00:26, 3F

01/19 02:53, , 4F
convolution
01/19 02:53, 4F

01/19 06:38, , 5F
你需要 Cartesian product (直積)
01/19 06:38, 5F

01/19 06:40, , 6F
01/19 06:40, 6F

01/19 06:41, , 7F
http://pastebin.com/NvsuMKxL (6顆骰子點數和機率)
01/19 06:41, 7F
沒想到還有這兩種運算方法可以用0.0 ......(理解中)(腦袋冒煙)

01/19 14:11, , 9F
how-can-i-create-cartesian-product-of-vector-of-
01/19 14:11, 9F

01/19 14:12, , 10F
vectors (C++ code,自己連結 link) :)
01/19 14:12, 10F

01/19 14:32, , 11F
喔喔感謝0.0
01/19 14:32, 11F

01/19 14:58, , 12F
有時間的話三種方法都各寫一個版本看看
01/19 14:58, 12F

01/19 17:26, , 13F
測資太大會跑不動(噴笑)
01/19 17:26, 13F

01/19 17:40, , 14F
10 顆骰子,測資會太大嗎?多少顆骰子算太大?
01/19 17:40, 14F

01/19 17:50, , 15F
10顆沒問題,不過會花點時間運算
01/19 17:50, 15F

01/19 17:51, , 16F
不過我還沒用Cartesian product來寫,待會貼上程式碼
01/19 17:51, 16F
我目前先用conan0914板友在下一篇提供的程式碼來跑 感謝conan0914提供的程式碼,讓我至少能完成第一版的程式 而且也能比較熟悉遞迴怎麼用 底下是完整的程式碼: http://codepad.org/YRy4ifog 不過題目要求要有5次、10次、20次的結果,而測到20次時程式就跑不動了XD 我還沒仔細研究Cartesian product,吃完晚餐來看看

01/19 18:06, , 17F
剛剛測了一下時間,扔十次要花三秒
01/19 18:06, 17F

01/19 18:07, , 18F
如果我沒理解錯的話,應該是要跑6^n次
01/19 18:07, 18F

01/19 18:07, , 19F
那扔20次要跑5.6年......
01/19 18:07, 19F

01/19 18:18, , 20F
另外我看一下6^20約有10^15 分散給20~120
01/19 18:18, 20F

01/19 18:19, , 21F
data type用int的話小心overflow
01/19 18:19, 21F

01/19 18:24, , 22F
可是在我的電腦上,long的大小和int一樣0.0
01/19 18:24, 22F

01/19 19:41, , 23F
20 顆骰子就得用 Dynamic Programming 才算得出來:)
01/19 19:41, 23F

01/19 20:13, , 24F
這又是一個要重新學習的範疇(死)
01/19 20:13, 24F

01/19 20:19, , 25F
http://codepad.org/gQHslXOG (20 顆點數和機率)
01/19 20:19, 25F

01/19 20:23, , 26F
居然瞬間想出來了......天啊
01/19 20:23, 26F
我目前的想法,是先把所有次數分成兩次兩次來算,分成幾小包 算完之後再每兩個小包下去算,重複直到結束 目前還在想實現的方法,不知道可不可行 ※ 編輯: o07608 (114.27.11.45), 01/19/2015 21:22:35

01/19 21:34, , 27F
提示:n顆點數和S 第一顆出1~6 其他顆總和S-1...S-6
01/19 21:34, 27F

01/20 17:09, , 28F
目前寫出來了,但不是用DP來寫的,現在回頭想DP
01/20 17:09, 28F
文章代碼(AID): #1KkvdPUy (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1KkvdPUy (C_and_CPP)