50 以最小精度 0.1 隨機分成 10 份,每份四捨五入後加和仍是 50 的概率為多少?

假如我現在有50塊,分給10個人。 最小的精度是0.1塊 每個人都拿到隨機數量的錢後,總數為50。 現在,進行一輪運算~ 如果一個人手中錢尾數為0.0到0.4,那麼捨去尾數。 如果一個人手中錢尾數為0.5-0.9,則進一。 問,這輪運算後,所有人手中的錢的和為50的概率


假定第k個人在四捨五入過程中對於最終的和的影響是varepsilon_k
由於sum_{k=1}^{10}varepsilon_k必須是整數,因此當前9個人的總影響sum_{k=1}^{9}varepsilon_k確定時,最後一個人的影響varepsilon_{10}就已經確定了。

varepsilon_k應該等概率地取離散的值{0.5,0.4,0.3,0.2,0.1,0,-0.1,-0.2,-0.3,-0.4}
做近似:	ilde varepsilon_k sim U(-0.45,0.55)
(可以這麼理解,最小精度0.1是這樣得到的:先隨機地給十個人各分一個實數,然後再四捨五入到小數點後一位小數。所以那些貢獻-0.4的人,最多可能拿到0.449999……=0.45,真實貢獻應該是-0.45,反之那些貢獻0.5的人,最少可能拿到0.45,真實貢獻是0.55)
所以
E[	ilde varepsilon_k]=1/20
D[	ilde varepsilon_k]=1/12

又由中心極限定理,近似地有sum_{k=1}^{9}	ilde varepsilon_k sim N(9/20,9/12)

只要sum_{k=1}^{9}	ilde varepsilon_k落在(-0.55,0.45)的範圍內,最後一個人	ilde varepsilon_{10}一定會使得sum_{k=1}^{10}	ilde varepsilon_k等於0
P{sum_{k=1}^{9}	ilde varepsilon_kin(-0.55,0.45)}
=Phi((0.45-9/20)/sqrt{9/12})-Phi((-0.55-9/20)/sqrt{9/12})
=Phi(0)-Phi(-2/sqrt{3})
approx 0.5 - 0.124107
=0.375893

當人數充分大時,上述做法可得到一個較好的近似值。


可以直接寫程序驗證, 答案是0.387828841

然後接下來是答主我的腦洞喵, 首先忽略題目中的50這個數字. 假設給定的數字足夠大, 使得小數位則是在0-9間分布近似於均勻分布且獨立於其他數位.

設小數位數字為X_iquad(X_iin{0,1,2,3,4,5,6,7,8,9}, 1leq ileq 10)
那麼關於小數位的約束條件為10;|;sum_{i=0}^{10}{X_i}
使用母函數求所有可行解:
g_X(x)=sum_{i=0}^{9}{x^i}
g_1(x)=(g_X(x))^{10}=left( sum_{i=0}^{9}{x^i}  
ight)^{10}
g_1(x)中所有c_ix^i;10|i的項的係數c_i的和即為所有滿足約束的可行小數位的數目:
M=sum_{10|i}^{}{c_i}
(iin{0,10,20,30,40,50,60,70,80,90})

接下來求所有在四捨五入後和仍然保持不變的所有情況
設四捨五入後每個數字的增量為varepsilon_i
當小數位0leq X_ileq4時, varepsilon_iin{0,-0.1,-0.2,-0.3,-0.4}
當小數位5leq X_ileq9時, varepsilon_iin{+0.5,+0.4,+0.3,+0.2,+0.1}
varepsilon_iin{-0.4,-0.3,-0.2,-0.1,0,+0.1,+0.2,+0.3,+0.4,+0.5}

要使得四捨五入後和仍然保持不變, 則要滿足以下約束:
sum_{i=0}^{9}{varepsilon_i}=0
繼續使用母函數求所有可行解:
g_{varepsilon }(x)=sum_{i=-4}^{5}{x^i}
g_2(x)=(g_{varepsilon }(x))^{10}=left( sum_{i=-4}^{5}{x^i}  
ight)^{10}=frac{left( sum_{i=0}^{9}{x^i}  
ight)^{10}}{x^{40}} =frac{g_1(x)}{x^{40}}
g_2(x)中的常數項, 即g_1(x)c_{40}x^{40}項的係數c_{40}為在四捨五入後和仍然保持不變的所有情況數目總和N=c_{40}

那麼在四捨五入後和仍然保持不變的概率
P=frac{N}{M}

好, 祭出神器Wolfram|Alpha計算N和M

得到
N=374894389
egin{split}M=2	imes(1+92368+9091270+115921972+374894389)\=1000000000end{split}

P=frac{374894389}{1000000000}=0.374894389

這個概率0.374894389是收斂值, 當給定的數字趨近於無窮大時收斂到該值. 題目中的50並不算足夠大, 因此概率為0.387828841, 0.374894389並不算是一個很好的估計值.

原因在於當在50的情況下小數位並不非常好的逼近均勻分布且並非獨立於其他數位, 需要考慮邊界情況, 若第一個數字為49.0, 那麼剩下的數字中的小數位不可能有兩個大於0.5. 若要完全手工計算將會非常麻煩.
如果數字足夠大的話(比如10000? 這個數字太大了, 沒辦法運行程序驗證)0.375是個很好的估計值.

附上程序計算的50,100,200,400,800,1600,3200,6400的概率.

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

&
&
&
&
&&
&

&
&
var money = 50;
var minAcc = 0.1;
var copies = 50 / 0.1;
//console.log(copies);
var people = [];
var sum = 500;
//四捨五入小數點一位
function toDecimal(x) {
var f = parseFloat(x);
if (isNaN(f)) {
return;
}
f = Math.round(x * 100) / 100;
return f;
}
//產生9個隨機數
for (var i = 0; i &<= 8; i++) { //console.log(Math.round(50 * Math.random())); people[i] = toDecimal(0.1 * (Math.round(100 * Math.random()))); } console.log(people); var people_total = 0; //9個隨機數求和 for (var j = 0; j &<= 8; j++) { people_total = people_total + people[j]; } //console.log(people_total); //得到第十位隨機數 if (people_total &>= 40 people_total &<= 50) { people[9] = toDecimal(50 - people_total); people_total = 0; } else { console.log("數據不合適測試") } /*for (var j = 0; j &<= 9; j++) { people_total = people_total + people[j]; }*/ //console.log(sum); //console.log(people_total); console.log(people); //四捨五入後的求和 var lastSum = 0; for (var z = 0; z &<= 9; z++) { lastSum = lastSum + Math.round(people[z]); } console.log(lastSum); &

&

&


我先提個非常不嚴謹的思路吧。。。

首先,我的第一直覺是"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 模型(獨立籌碼模型)?
最優化問題的簡潔介紹是什麼?

TAG:數學 | 趣味數學 | 數學建模 |