概率模擬可模擬行星運動、細胞生成。將反直覺的概率問題,利用算法模擬出來。
房間裡有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);
可以看到符合冪律分佈。
需要完整代碼,請轉發該文章並點贊,然後私信乾貨菌獲取。
閱讀更多 學點乾貨 的文章