基尼系数,一开始有100人,每个人都有100元 在每一轮都做如下的事情 每个人都必须拿出1元钱给除自己以外的其他人,给谁完全随机 如果某个人在这一轮的钱数为0;那么他可以不给,但是可以接收 发生很多很

       题目:

         一开始有100人,每个人都有100元 在每一轮都做如下的事情 每个人都必须拿出1元钱给除自己以外的其他人,给谁完全随机 如果某个人在这一轮的钱数为0;那么他可以不给,但是可以接收 发生很多很多轮之后,这100人的社会财富分布很均匀吗?

 

        

public class GiniCoefficient {

    @Test
    public void test(){
        System.out.println("一个社会的基尼系数是一个0-1之间的小数");
        System.out.println("基尼系数为0代表所有人财富完全一样");
        System.out.println("基尼系数为1代表有1个人掌握全社会的财富");
        System.out.println("基尼系数越小,代表社会财富分布越均衡,越大则代表财富分布不均衡");
        System.out.println("在2022年,世界各地的基尼系数为0.44");
        System.out.println("目前普遍认为,当基尼系数到达0.5时候");
        System.out.println("就意味着社会贫富差距非常大,分布非常不均匀");
        System.out.println("社会因此可能因此陷入危机,比如大量的犯罪或社会的动荡");
        System.out.println("测试开始");

        int n=100; //人数
        int t=1000000; //轮数
        experiment(n,t);
        System.out.println("测试结束");
    }
    private static void experiment(int n, int t) {
        double[] wealth=new double[n];// [0,0,0,0...n]
        Arrays.fill(wealth, 100);//[100,100,100,100...100]
        boolean[]hasMoney=new boolean[n];
        for (int i = 0; i <t ; i++) {  //1-t-1 轮 次数
            Arrays.fill(hasMoney, false);  //假设每个人都没有钱
            for (int j = 0; j <n ; j++) {
                    if(wealth[j]>0){
                        hasMoney[j]=true;
                    }
            }
            for (int j = 0; j <n ; j++) {
                if(hasMoney[j]){
                    int other=j;
                    do{
                        other=(int)(Math.random()*n); //0-99 随机概率一样
                    }while(other==j);  //直到不是自己是退出
                    wealth[j]--; //自己-1元
                    wealth[other]++; //别人+1元
                }
            }
        }
        Arrays.sort(wealth); //从小到大排序
        System.out.println("列出每个人的财富(贫穷到富有)");
        for (int i = 0; i <n ; i++) {
            System.out.print((int)wealth[i]+" ");
            if(i%10==9){
                System.out.println();
            }
        }
        System.out.println();
        System.out.println("这个社会的基尼系数为:"+calculateGini(wealth));
    }
    //基尼稀疏怎么算
    //绝对财富差值和/2*n*所有财富
    public static double calculateGini(double[]wealth){
        double sumOfWealth=0; //所有财富
        double sumOfAbsoluteDifferences=0; //绝对财富差值
        int n=wealth.length; //人数
        for (int i = 0; i <n ; i++) {
            sumOfWealth+=wealth[i]; //统计所有财富
            for (int j = 0; j <n ; j++) {  //第一个人与其他人所有的人的差值.....依次类推
                sumOfAbsoluteDifferences+=Math.abs(wealth[i]-wealth[j]);
            }
        }
        return sumOfAbsoluteDifferences/(2*n*sumOfWealth);
    }

}

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值