在知乎看到一个有意思的问题:房间内有 100 人,每人有 100 块,有钱的人每分钟随机给另一个人 1 块,最后这个房间内的财富分布怎样?
最近在研究 java8 的新特性,就用相关代码写了一个demo。使用lambda表达式和函数式风格编程,代码简洁,看起来跟Scala非常相似!
使用Stream操作对象,只需要几行代码就能解决复杂的循环问题。
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
//解决问题:房间内有 100 人,每人有 100 块,有钱的人每分钟随机给另一个人 1 块,最后这个房间内的财富分布怎样?
public static void main(String[] args) {
//基于java8,stream特性,创建对象,100长度list,每个元素为100,即100个人,每人100元钱
List money= Stream.iterate(100 , n -> 100).limit(100).collect(Collectors.toList());
//循环给钱,注意给钱是每分钟一次批量给,有钱的人才给
for(int i=0;i<200000;i++){
//被给钱的对象,临时记录(有钱的人减一元)
List moneyTemp=money.stream().map(n -> {return n>0?n-1:0;}).collect(Collectors.toList());
//同一时间,钱大于0的人,给一元到随机的一个人
money.stream().filter(n -> n>0).forEach(n -> {int a=(int)(Math.random()*100);moneyTemp.set(a,moneyTemp.get(a)+1);});
//赋值给money
money=moneyTemp;
//排序之后再打印结果
System.out.println("打印结果,list="+money.toString());
System.out.println("打印排序后的结果,list="+money.stream().sorted().collect(Collectors.toList()).toString());
}
}
}
代码输出结果(最后一次的结果,排序是为了方便观察规律):
打印结果,list=[61, 62, 53, 4, 34, 206, 29, 21, 156, 0, 115, 117, 138, 411, 1, 16, 302, 253, 163, 227, 140, 23, 92, 41, 89, 16, 142, 9, 171, 150, 116, 39, 68, 178, 621, 291, 53, 13, 79, 58, 8, 155, 92, 110, 3, 28, 79, 152, 68, 61, 5, 24, 67, 1, 71, 119, 182, 214, 84, 31, 106, 177, 208, 169, 33, 32, 8, 90, 99, 20, 20, 49, 377, 78, 60, 155, 50, 163, 71, 99, 12, 96, 163, 57, 201, 64, 124, 20, 121, 28, 259, 88, 27, 8, 21, 233, 68, 0, 13, 21]
打印排序后的结果,list=[0, 0, 1, 1, 3, 4, 5, 8, 8, 8, 9, 12, 13, 13, 16, 16, 20, 20, 20, 21, 21, 21, 23, 24, 27, 28, 28, 29, 31, 32, 33, 34, 39, 41, 49, 50, 53, 53, 57, 58, 60, 61, 61, 62, 64, 67, 68, 68, 68, 71, 71, 78, 79, 79, 84, 88, 89, 90, 92, 92, 96, 99, 99, 106, 110, 115, 116, 117, 119, 121, 124, 138, 140, 142, 150, 152, 155, 155, 156, 163, 163, 163, 169, 171, 177, 178, 182, 201, 206, 208, 214, 227, 233, 253, 259, 291, 302, 377, 411, 621]
问题的答案挺有意思的,结果金钱并不会平均分布,最大的能到600多元,最少的0元,会有很大的差别。
我已开始也以为钱会平均分布,实在理解不到原因。不过知乎上已经有相关的原理和公式推导,有兴趣的同学可以去搜索一下。其实这是一个热力学问题,一个封闭的系统中,在粒子数量足够大,系统处于平衡态时,粒子处在某一状态下的概率应呈指数形式分布。