大家好,今天來分享一個有意思的分錢模擬問題,為了幫助大家理解,採取了可視化的方式。
這個問題描述是這樣的:房間裡有 100 個人,每人都有 100 元錢,他們在玩一個遊戲。每輪遊戲中,每個人都要拿出一元錢隨機給另一個人,最後這 100 個人的財富分佈是怎樣的?
猜一下,經過 10000 次的交換,你們認為最後的結果會是怎麼樣子的?
5
4
3
2
1
登登登,答案是這個樣子的。
和你的直覺想法有出入嗎?是不是一開始認為是平均分佈的?
事實上,很多人一開始都沒想到結果會是這樣子的。
我們藉助 Java GUI 來可視化的理解這個問題。
首先初始化數據,一開始每人都有 100 元錢。
// 初始化數據
money = new int[100];
for(int i = 0 ; i < money.length ; i ++)
money[i] = 100;
初始狀態
然後每輪遊戲中,每個人都要拿出一元錢隨機給另一個人,
for(int i = 0 ; i < money.length; i ++){
if(money[i] > 0){
int j = (int)(Math.random() * money.length);
money[i] -= 1;
money[j] += 1;
}
}
不夠直觀?那我們可以先排序再顯示。
Arrays.sort(money);
for(int i = 0 ; i < money.length; i ++){
if(money[i] > 0){
int j = (int)(Math.random() * money.length);
money[i] -= 1;
money[j] += 1;
}
}
排序
我們可以發現,初始時所有人的財富值相等,隨著遊戲的進行,財富值差距越來越大,而不是均勻分佈。
感興趣繼續研究的小夥伴可以下載下方的源碼。
完整代碼:https://github.com/MisterBooo/AmazingAlgo
參考閱讀:
- 看的見的算法:https://coding.imooc.com/class/138.html
- 該如何面對這個殘酷的世界?:https://www.sohu.com/a/162310796_99952273
來源 | 五分鐘學算法
作者 | 程序員吳師兄