50 以最小精度 0.1 隨機分成 10 份,每份四捨五入後加和仍是 50 的概率為多少?
假如我現在有50塊,分給10個人。 最小的精度是0.1塊 每個人都拿到隨機數量的錢後,總數為50。 現在,進行一輪運算~ 如果一個人手中錢尾數為0.0到0.4,那麼捨去尾數。 如果一個人手中錢尾數為0.5-0.9,則進一。 問,這輪運算後,所有人手中的錢的和為50的概率
假定第k個人在四捨五入過程中對於最終的和的影響是
由於必須是整數,因此當前9個人的總影響確定時,最後一個人的影響就已經確定了。
應該等概率地取離散的值{0.5,0.4,0.3,0.2,0.1,0,-0.1,-0.2,-0.3,-0.4}
做近似:
(可以這麼理解,最小精度0.1是這樣得到的:先隨機地給十個人各分一個實數,然後再四捨五入到小數點後一位小數。所以那些貢獻-0.4的人,最多可能拿到0.449999……=0.45,真實貢獻應該是-0.45,反之那些貢獻0.5的人,最少可能拿到0.45,真實貢獻是0.55)
所以
又由中心極限定理,近似地有
只要落在(-0.55,0.45)的範圍內,最後一個人一定會使得等於0
而
可以直接寫程序驗證, 答案是0.387828841
然後接下來是答主我的腦洞喵, 首先忽略題目中的50這個數字. 假設給定的數字足夠大, 使得小數位則是在0-9間分布近似於均勻分布且獨立於其他數位.
設小數位數字為
那麼關於小數位的約束條件為
使用母函數求所有可行解:
取中所有的項的係數的和即為所有滿足約束的可行小數位的數目:
接下來求所有在四捨五入後和仍然保持不變的所有情況
設四捨五入後每個數字的增量為
當小數位時,
當小數位時,
要使得四捨五入後和仍然保持不變, 則要滿足以下約束:
繼續使用母函數求所有可行解:
取中的常數項, 即中項的係數為在四捨五入後和仍然保持不變的所有情況數目總和
那麼在四捨五入後和仍然保持不變的概率
好, 祭出神器Wolfram|Alpha計算N和M
得到
這個概率0.374894389是收斂值, 當給定的數字趨近於無窮大時收斂到該值. 題目中的50並不算足夠大, 因此概率為0.387828841, 0.374894389並不算是一個很好的估計值.
原因在於當在50的情況下小數位並不非常好的逼近均勻分布且並非獨立於其他數位, 需要考慮邊界情況, 若第一個數字為49.0, 那麼剩下的數字中的小數位不可能有兩個大於0.5. 若要完全手工計算將會非常麻煩.
如果數字足夠大的話(比如10000? 這個數字太大了, 沒辦法運行程序驗證)0.375是個很好的估計值.
50:
1906648713961794089/4916211776037821974=0.387828841
100:
1004901309853184950679/2634095604619702128324=0.381497660
200:
521762931103690968054484/1379493929730028066444149=0.378227783
400:
268987116653412278128471469/714310778873243637281638299=0.376587494
800:
138191979277773845715974392939/367792590738126727511158276599=0.357733451
1600:
70874552120095071103511202585879/188840488833907511303264696553199
=0.375314386
3200:
36318530101945809676031995292371759/96822431515679350557737866913106399
=0.375104504
6400:
18602958382671532327456721013909543519/49607958446817509974848148027906212799
=0.374999475
代碼我就不貼啦, 其他答主有貼.
觀察得到這是個遞減序列, 因此0.374894389是下確界. 嚴格證明太繁瑣了不想做|ω?)
如果是我出題我就把數字改成10000喵~程序就跑不動了哈喵~
樓上的蒙特卡洛確實簡單有效
不過精確解也是可以得到的
寫了個DP跑出來是1906648713961794089/4916211776037821974
大概是0.3878288407458396
附上從2到10的結果
2 449 499 0.899799599198
3 90876 124251 0.731390491827
4 13064224 20584249 0.634670907838
5 1446233751 2552446876 0.566606797814
6 129828144144 252692240724 0.513779702028
7 9833630622711 20804994486276 0.472657208787
8 643459967560984 1465266040247724 0.439142073785
9 37067021963756946 90113861475235026 0.41133540786
10 1906648713961794089 4916211776037821974 0.387828840746
以下為扯淡:
其實四捨五入是一個不太平衡的演算法,因為1 2 3 4 舍, 5 6 7 8 9 入, 舍的數字1-4和是10,而入的數是5-1, 和是15
cnt = 0
success = 0
num = 10
total = 500
total2 = 50
def deal(x):
if x % 10 &< 5:
return (x - x % 10) / 10
return (x - x % 10) / 10 + 1
def do_dp():
dp = [[[0 for x in xrange(total2 * 2 + 1)] for y in xrange(total + 1)] for z in xrange(num + 1)]
dp[1][500][50] = 1
for i in xrange(total):
dp[1][i][deal(i)] = 1
for i in xrange(1, num):
for j in xrange(1, total):
for k in xrange(total2 * 2 + 1):
if dp[i][j][k] == 0:
continue
for l in xrange(1, total):
if j + l &<= total:
dp[i + 1][j + l][k + deal(l)] += dp[i][j][k]
print sum(dp[num][500]), dp[num][500][50]
myfun&<-function(n){
x&<-rep(5,10)
k&<-0
m&<-0
for (i in 1:n){
y&<-round(runif(9,-5,5)+0.0001,digits = 1)
if (sum(y)&<=55 sum(y)&>=-45){
y&<-c(y,-sum(y))
xx&<-x+y
k&<-k+1
if (sum(round(xx+0.0001,0))==50) m&<-m+1
}
}
return(m/k)
}
myfun2&<-function(x=100){
t&<-c(1:x)
for (i in 1:x){
t[i]&<-myfun(100000)
}
return(summary(t))
}
用R寫的代碼,n是運算次數,演算法為先生成10個5,然後生成9個[-5,5]的隨機數,四捨五入到小數點後1位,算出第10個數,然後用5+隨機數得到最終生成序列,最後判斷四捨五入到整數後和是否為50。
跑了多次,最終結果為
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.3714 0.3736 0.3746 0.3748 0.3758 0.3788
簡單粗暴有效:
%%
repeat = 1000000;
simres = zeros(repeat, 1);
for nn = 1: repeat
idx = randperm(500-1, 10-1);
idx = [sort(idx), 500];
start = 1;
for ii = 1: 10
tmp = idx(ii) - start + 1;
simres(nn, 1) = simres(nn, 1) + round(tmp/10);
start = idx(ii) + 1;
end % for ii
end % for nn
%%
pp = zeros(repeat, 1);
for nn = 1: repeat
pp(nn) = mean( simres(1:nn)==50 );
end
subplot(2, 1, 1);
hist(simres, 20);
subplot(2, 1, 2);
plot(pp);
最後結果 0.388 左右。
認為結果取決於分發使用的隨機分布吧,雖然是說隨機發放,但這個隨機的統計特徵是什麼,會決定最後的結論
用js簡單的模擬了這道題,下面放代碼,思路是這樣的,50元因為最低精度為0.1,所以測試範圍應該為500角,所以等於有500份一毛錢分配給10個人,每個人分配完500份1毛錢是隨機份數的,為了不會隨機產生的數字讓最後擠出一位較大的數值,所以我默認每個人得到的最大值為10.0元,事實上基本是圍繞在每個人拿到5.0的情況下,然而最公平的應該就是每個人都是在5.0這個數字上下浮動,所以為了得到這個比較公正的測算模型,我進行了一定的數學模型篩選,從第一份大概的測試結果顯示,數據圍繞在48~52之間,至於概率其實大家都基本可以總結得出來的,因為分配的人數不是重點,所以分100人跟分1個人的概率是一樣的,所以概率一眼就能看出來,原代碼放在github上,有需要自取吧~
https://github.com/AutumnsWind/Math
&
&
&
&
&
&
&
&
&
&
我先提個非常不嚴謹的思路吧。。。
首先,我的第一直覺是"50"在這裡沒有用,因為我們在乎的是四捨五入後小數點後的事情,小數點前的大小無所謂。但這個直覺是錯的。假如十個數的和比較小,比如是8,就很可能出現一個數非常大,比如是7.2,把剩下七個數「擠」到一起,導致他們的和&<50。這種情況是十數和越大就越難發生。像50這樣大小的和,應該結果與和為10000或者一個任意大小的大整數差不太多。由於有這種情況,我覺得這題不會有非常整潔的精確解,雖然它的精確解會很接近一個整潔的數(這個整潔的精確解是和為很大整數的情況)。
_______________以下步驟有誤。。。_________________________________________
其次,我很快就發現,要想讓和為50,必須有5個數舍,5個數入。我們管舍的數(&<0.5)叫做舍數,入的數(&>=0.5)叫做入數。根據以上思路,我們可以假設前9個數的小數點後是0~9之間獨立平均分布(這並不正確,但由於他們的和50足夠大,這足夠精確),也就是說每個數都有50%可能是舍數。最後一個數」沒有選擇餘地「,因為它必須是1 - (9個數的和) % 1。9個數中必須有5個舍數4個入數,或者5個入數4個舍數,我們才有希望讓和=50。有希望的可能性為((9 choose 4)+(9 choose 5))/2^9=252/512=63/128。
當9個數中5個舍數4個入數時,他們的和的均值為5*E(舍數)+4*E(入數)=5*0.2+4*0.7=3.8。他們的和的標準差為sqrt(var(sum of 9))=sqrt(9*var(舍數)) =sqrt(9*var([0,0.1,0.2,0.3,0.4])) =sqrt(9/40) ~=0.474。
假如這9個數的和在2.1~2.5之間或者是3.1~3.5之間或者是4.1~4.5之間或者是5.1~5.5之間,那最後一個數就必須是入數,我們就有5個舍數五個入數,就成功了。這種情況的可能性大約為
prob([2.05,2.55],[3.05,3.55],[5.05,5.55])
=cdf.norm(5.55)-cdf.norm(5.05)+cdf.norm(4.55)-cdf.norm(4.05)
+cdf.norm(3.55)-cdf.norm(3.05)+cdf.norm(2.55)-cdf.norm(2.05)
=0.0041 + 0.2422 + 0.2422 + 0.0041 = 0.4926. *
其中cdf.norm是均值=3.8,標準差=sqrt(9/40)的正態累積分布函數
當9個數中4個舍數5個入數時,計算結果也是0.4926。*
所以可能性是63/128 * 0.4926 = 24.24%。這和LiTux的simulation得出來的38.8%離得有點遠。歡迎大家指錯。
*很顯然,這說明最後一個數雖然沒有」選擇餘地「,但它是入數的可能性基本是50%。
取值範圍應該是46~55之間。具體怎麼得到分布函數我尚不知。若此題改為50,分為100份,精度為0.01,四捨五入到最小位數上一位,它的分布又是怎樣?依次,1000份精度0.001等。最後極限形式分布又會是怎樣的?在此挖坑。
一個數以最小精度0.1 的意思 是說 有多少種分法 ?
1 , 0.9 0.8 。。。。0.1 , 十種分法 。隨機概率平均 。
分出來的數據落在 0.0- 0.4 、 。0.5-0.9 概率各是 50% 。
所以應該是50% 。
推薦閱讀:
※與數學撇清關係的經濟學是不是都在耍流氓?
※如果一個人的兩次考試成績在班裡排前十,那麼這個人的兩次考試總成績在班裡一定排名前十嗎?
※n 個平面最多把 3 維空間分成幾個部分?
※如何理解德州撲克中的 ICM 模型(獨立籌碼模型)?
※最優化問題的簡潔介紹是什麼?