不斷扔骰子,扔到總和大於22的時候喊停,問這個時候總和最可能是多少?


答案是23.

結束前最後一次總和可以是17、18、19、20、21、22. 如果是17, 那麼最後只能是23. 如果是18-22, 那麼是23的概率不小於是24-28的概率。(比如是20,那麼最後是23-26各0.25的概率)

綜上,23的概率最大。


我對於數學一竅不通,但是我覺得答案應該是23

1.(這個是標準的數學方法!叉腰)

腦補的演算法:

Pi代表扔骰子之和為i的概率

P23=(P17+P18+P19+P20+P21+P22)*1/6

P24=(P18+P19+P20+P21+P22)*1/6

P25=(P19+P20+P21+P22)*1/6

P26=(P20+P21+P22)*1/6

P27=(P21+P22)*1/6

P28=P22*1/6

答案貌似顯而易見……

2.(這個是跑程序算正確的概率哦,不是在模擬扔骰子呀-.-)

嘗試拿程序跑了一發

狀態轉移方程:

Pi=sum_{j=i-6}^{i-1}{Pj}*frac{1}{6}

所以代碼:http://paste.ubuntu.com/10105007/

跑出來結果:

(這個結果大概是代表,從0開始扔骰子,能夠扔到和為 i 的概率)

(左邊代表 i ,右邊代表概率)

1 0.166667

2 0.194444

3 0.226852

4 0.26466

5 0.308771

6 0.360232

7 0.253604

8 0.268094

9 0.280369

10 0.289288

11 0.293393

12 0.29083

13 0.279263

14 0.28354

15 0.286114

16 0.287071

17 0.286702

18 0.285587

19 0.284713

20 0.285621

21 0.285968

22 0.285944

--------------------------------------分界線---------------------------------

23 0.285756

24 0.237972

25 0.190374

26 0.142922

27 0.0953186

28 0.0476573

sum_{i=23}^{28}{Pi} =1

唔,算了算,從扔出骰子和為23-28的概率和整好為1.

//由於數學水平只停留在高二水平……

//如果錯了 還望指出


明顯是作業題,可以簡化為 random walk with finite exit time。讀 Essentials of Stochastic Processes 找到正確章節,有原題。

當然,如果不是作業,你只是認真的想知道答案,就做一個巨大的,30*30的transitive matrix,接著算stable probability。


嘛……

from __future__ import division
Array = [1,1/6,]
def all(prev):
for i in range(1,50):
try:
prev[i]
except:
res = 0
for j in range(i-1,i-7,-1):
try:
if(j&>=0 and j&<23): res += 1/6*prev[j] except: pass prev.append(res) return prev res = all(Array) print "%s "*len(res)%tuple(["No.%s - %s" %(i,res[i]) for i in range(len(res))])

自己試一下吧


#include &
#include &
#include &
#define NUMS 1000000
int main() {
int sum[NUMS] = {0};
int cnt[6];
std::srand(time_t(NULL));
for (int i = 0; i &< NUMS; i++) { while (sum[i] &<= 22) sum[i] += ((int)std::rand() % 6 + 1); cnt[sum[i] - 23]++; } for (int i = 0; i &< 6; i++) { std::cout &<&< i + 23 &<&< ": " &<&< cnt[i] &<&< " " &<&< cnt[i] / (double)NUMS * 100 &<&< "%" &<&< std::endl; } }

確實是23。。。數學渣想了十分鐘以後沒想出怎麼算概率於是開掛。。。


隨便寫了點matlab代碼,10w次模擬。

http://pastebin.com/tVdhT0RE

平均為24.67次,概率為

23 0.2854

24 0.2376

25 0.1894

26 0.1426

27 0.0970

28 0.0480

順便做了個28x28的矩陣。穩定分布跟模擬出來的差不多。


這裡給一個可以手算的解答。

附python程序:

from math import pi, exp, sqrt
def f(N, x, mu0=3.5):
"""Approximate the summation of N dices with a gaussian.
N: Number of dice throws;
x: a value of possible sum.
"""
return exp(-(x-mu0*N)**2/(6*N))/sqrt(6*N*pi)

def g(n, nmin=1, nmax=50):
s = 0.0
for i in xrange(nmin, nmax):
s += f(i+1, n)
return (29.0-n)/6.0 * s

for n in xrange(23,29):
print "{0:d}: {1:8.5f}".format(n, g(n))

-----Old-------------------------------------------------------

經數值模擬,答案是(跟已有答案里的計算結果一樣):

p(23) : p(24) : p(25) : p(26) : p(27) : p(28) 非常接近 6 : 5 : 4 : 3 : 2 : 1

這麼簡單的答案,必定有個簡單的解釋。

如果把原題中的22改成更大的數,會更接近上述比例。

如果把原題中的22改成更小的數,則會偏離上述比例。

比如改成1,則結果是

p(2) : p(3) : p(4) : p(5) : p(6) : p(7) = 7 : 7 : 7 : 7 : 7 : 1

這個稍微算一下就可得到。

附Monte Carlo程序:

#include &
#include &
#include &

#define NSURF_DICE 6

int main(int argc, char *argv[]){
int ngoal, n_throw_max, n_trial;
if (argc &< 3) { ngoal = 22; n_trial = 10000000; } else { ngoal = atoi(argv[1]); n_trial = atoi(argv[2]); } n_throw_max = ngoal + 1; int *rec; rec = new int[NSURF_DICE]; for (int i=0; i& ngoal) {
rec[s-ngoal-1] += 1;
break;
} else {
s0 = s;
}
}
}
float s = 0.0, p, p0=0;
for (int i=0; i&


大富翁嗎,哈哈


個人感覺此題是高考數學選擇題的水平:第一眼的想法和一樓一樣,就不重複說了。

樓上各位用程序跑的有沒有想過

把題主說的大於22改成大於2的10000萬次方或者更大的數呢?,應該是跑不出結果的

還有一點是不是應該考慮下呢?計算機產生的隨機數是偽隨機數,從某種程度上說是有規律的數!,所以用計算機模擬出來的隨機結果求概率不靠譜。用以前一個做工程很牛的老師的話說 『』用計算機的黑箱方法解答數學問題只是浪費時間而已『』

最重要的一點我想說的是!!!這題如果大家覺得自己用計算機跑的結果是對的,那麼等同於你覺得自己解決了哥德巴赫猜想,因

為可以把22改成任意一個自然數n,22隻不過是一個特例。

以上純屬個人愚見,,,


推薦閱讀:

大學階段,你是怎麼樣進行時間管理的?

TAG:編程 | 數學建模 | 概率論 |