大數據

一個有意思的分錢模擬問題

大家好,今天來分享一個有意思的分錢模擬問題,為了幫助大家理解,採取了可視化的方式。

這個問題描述是這樣的:房間裡有 100 個人,每人都有 100 元錢,他們在玩一個遊戲。每輪遊戲中,每個人都要拿出一元錢隨機給另一個人,最後這 100 個人的財富分佈是怎樣的?

猜一下,經過 10000 次的交換,你們認為最後的結果會是怎麼樣子的?
5
4
3
2
1
登登登,答案是這個樣子的。

image.png

和你的直覺想法有出入嗎?是不是一開始認為是平均分佈的?

事實上,很多人一開始都沒想到結果會是這樣子的。

我們藉助 Java GUI 來可視化的理解這個問題。

首先初始化數據,一開始每人都有 100 元錢。

// 初始化數據
   money = new int[100];
   for(int i = 0 ; i < money.length ; i ++)
       money[i] = 100;

image.png

初始狀態

然後每輪遊戲中,每個人都要拿出一元錢隨機給另一個人

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;
       }
  }

1.gif

不夠直觀?那我們可以先排序再顯示。

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;
       }
  }

2.gif

排序

我們可以發現,初始時所有人的財富值相等,隨著遊戲的進行,財富值差距越來越大,而不是均勻分佈。

感興趣繼續研究的小夥伴可以下載下方的源碼。

完整代碼:https://github.com/MisterBooo/AmazingAlgo

參考閱讀:

來源 | 五分鐘學算法
作者 | 程序員吳師兄

Leave a Reply

Your email address will not be published. Required fields are marked *