不斷扔骰子,扔到總和大於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/6P24=(P18+P19+P20+P21+P22)*1/6P25=(P19+P20+P21+P22)*1/6P26=(P20+P21+P22)*1/6P27=(P21+P22)*1/6P28=P22*1/6答案貌似顯而易見……2.(這個是跑程序算正確的概率哦,不是在模擬扔骰子呀-.-)
嘗試拿程序跑了一發狀態轉移方程:所以代碼:http://paste.ubuntu.com/10105007/跑出來結果:
(這個結果大概是代表,從0開始扔骰子,能夠扔到和為 i 的概率)(左邊代表 i ,右邊代表概率)1 0.1666672 0.1944443 0.226852
4 0.264665 0.3087716 0.3602327 0.2536048 0.2680949 0.28036910 0.28928811 0.29339312 0.2908313 0.279263
14 0.2835415 0.28611416 0.28707117 0.28670218 0.28558719 0.28471320 0.28562121 0.28596822 0.285944--------------------------------------分界線---------------------------------
23 0.28575624 0.23797225 0.19037426 0.14292227 0.095318628 0.0476573唔,算了算,從扔出骰子和為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;
}
}
隨便寫了點matlab代碼,10w次模擬。
http://pastebin.com/tVdhT0RE平均為24.67次,概率為
23 0.285424 0.237625 0.189426 0.142627 0.097028 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))
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&
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隻不過是一個特例。以上純屬個人愚見,,,推薦閱讀: