「算法基礎」機率模擬—財富的分配

概率模擬可模擬行星運動、細胞生成。將反直覺的概率問題,利用算法模擬出來。

房間裡有100個人,每人都有100元錢,每輪每人要拿一元錢隨機給另一個人,最後100個人的財富分佈是怎樣的?

按照直覺,大家是公平的,所以最後財富分佈也應該差不多。但是統計學和隨機過程中,直覺往往是錯誤的,我們來用算法模擬一下。

初始的時候每個人都是100元。

money = new int[100];

for(int i = 0 ; i < money.length ; i ++)

money[i] = 100;

每一趟,一個人隨機給另一個人1元

for(int i = 0 ; i < money.length; i ++){

if(money[i] > 0){

int j = (int)(Math.random() * money.length); //產生[0,100)整數,隨機給其1元

money[i] -= 1;

money[j] += 1;

}

}

具體繪製過程,用之前的JavaGui框架,也可以自己實現。

// 具體繪製

AlgoVisHelper.setColor(g2d, AlgoVisHelper.Blue);

int w = canvasWidth / money.length;

for(int i = 0 ; i < money.length ; i ++)

AlgoVisHelper.fillRectangle(g2d,

i*w+1, canvasHeight-money[i], w-1, money[i]);

「算法基礎」概率模擬—財富的分配

在繪製過程中,加快繪製,可以將每一輪繪製一次變成每100次繪製一次。

money允許有負債。

// 改進1:每一幀執行的輪數

for(int k = 0 ; k < 50 ; k ++){

for(int i = 0 ; i < money.length; i ++){

// 改進2:允許money為負值

//if(money[i] > 0){

int j = (int)(Math.random() * money.length);

money[i] -= 1;

money[j] += 1;

//}

}

}

具體繪製,有負值。

int w = canvasWidth / money.length;

for(int i = 0 ; i < money.length ; i ++)

if(money[i] > 0) {

AlgoVisHelper.setColor(g2d, AlgoVisHelper.Blue);

AlgoVisHelper.fillRectangle(g2d,

i * w + 1, canvasHeight / 2 - money[i], w - 1, money[i]);

}

else{

AlgoVisHelper.setColor(g2d, AlgoVisHelper.Red);

AlgoVisHelper.fillRectangle(g2d,

i * w + 1, canvasHeight / 2, w - 1, -money[i]);

}

可以對錢數排序

Arrays.sort(money);

可以看到符合冪律分佈。


需要完整代碼,請轉發該文章並點贊,然後私信乾貨菌獲取。


分享到:


相關文章: