概率模拟可模拟行星运动、细胞生成。将反直觉的概率问题,利用算法模拟出来。
房间里有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);
可以看到符合幂律分布。
需要完整代码,请转发该文章并点赞,然后私信干货菌获取。
閱讀更多 學點乾貨 的文章