3.从社会实验到入门提醒

1.进行一个社会实验

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

基尼系数求法:
在这里插入图片描述
java代码:

import java.util.Arrays;

//一开始有100个人,每个人都有100元
//在每一轮都做如下的事情:
//每个人都必须拿出1元钱给除自己以外的其他人,给谁完全随机
//如果某个人在这一轮的钱数为0,那么他可以不给,但是可以接收
//发生很多很多轮之后,这100人的社会财富分布很均匀吗?
//注意:上面的文字要用英文逗号隔开,不然逗号左右字体会不同!!!
public class code1 {
	public static void main(String[] agrs) {
		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 = 100000;
		System.out.println("人数:  "+n);
		System.out.println("轮数:  "+t);
		experiment(n,t);
		System.out.println("测试结束");
	}
	
	public static void experiment(int n ,int t) {
		double [] wealth = new double[n];
		Arrays.fill(wealth, 100);
		boolean[] hasMoney = new boolean[n];
		for(int i = 0;i < t;i++) {
			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 {
						//(int)(Math.random()*n)
						//int : 0~n-1,等概率随机
						other = (int)(Math.random() * n);
					}while(other == j);
					wealth[j]--;
					wealth[other]++;
				}
			}
		}
		Arrays.sort(wealth);
		System.out.println("列出每个人的财富(从贫穷到富有) : ");
		for(int i = 0; i < n;i++) {
			System.out.println((int)wealth[i]+" ");
			if(i % 10 == 9) {
				System.out.println();
			}
		}
		System.out.println();
		System.out.println("这个社会的基尼系数为 : " + calculateGini(wealth));
	}
	
	//计算基尼系数
	//看代码就可以轻易知道如何计算的
	public static double calculateGini(double[] wealth) {
		double sumOfAbsoluteDifference = 0;
		double sumOfWeath = 0;
		int n = wealth.length;
		for(int i = 0;i < n;i++) {
			sumOfWeath += wealth[i];
			for(int j = 0;j < n ;j++) {
				sumOfAbsoluteDifference += Math.abs(wealth[i] - wealth[j]);
			}
		}
		return sumOfAbsoluteDifference / (2 * n * sumOfWeath);
	}
}


2.入门提醒

(1).多敲多练,敲正确一个再下一个
(2).多往下学,因为后面可能会大量用到前面的东西,所以在学习后面的时候会有助于你对前面知识的吸收,反而你要是一味的进行复习,会使效率低下。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值