「算法基础」概率模拟—财富的分配

概率模拟可模拟行星运动、细胞生成。将反直觉的概率问题,利用算法模拟出来。

房间里有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);

可以看到符合幂律分布。


需要完整代码,请转发该文章并点赞,然后私信干货菌获取。


分享到:


相關文章: