房间内有 100 人,每人有 100 块,有钱的人每分钟随机给另一个人 1 块,最后这个房间内的财富分布怎样?...

在知乎看到一个有意思的问题:房间内有 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元,会有很大的差别。

我已开始也以为钱会平均分布,实在理解不到原因。不过知乎上已经有相关的原理和公式推导,有兴趣的同学可以去搜索一下。其实这是一个热力学问题,一个封闭的系统中,在粒子数量足够大,系统处于平衡态时,粒子处在某一状态下的概率应呈指数形式分布。

转载于:https://my.oschina.net/u/2485991/blog/1341297

你可能感兴趣的:(房间内有 100 人,每人有 100 块,有钱的人每分钟随机给另一个人 1 块,最后这个房间内的财富分布怎样?...)