一开始有 100 个人,每个人都有 100 元,在每一轮都做如下的事情:
(1)每个人必须拿出 1 元钱随机给其它人。
(2)如果一个人没有钱,可以只收不给。
多轮之后,这 100 个人的社会财富分布均匀吗?
基尼系数是一个 0-1 之间的小数,可以衡量社会财富分布的均匀程度:
(1)0 表示所有人的财富完全一样。
(2)1 表示有一个人掌握了全社会的财富
(3)当基尼系数达到 0.5 时,社会贫富差距巨大,可能会引起社会剧烈动荡
(4)计算公式为:
代码实现如下所示:
#include <cstdlib>
#include <ctime>
#include <vector>
#include <cmath>
#include <cstdio>
class Solution{
public:
double calculate_gini(const std::vector<double> &wealth){
double result = 0;
double all_wealth = 0;
double people_number = wealth.size();
double all_difference_absolute = 0;
for(int i = 0; i < people_number; ++i){
all_wealth += wealth[i];
for(int j = i + 1; j < people_number; ++j){
all_difference_absolute += std::abs(wealth[i] - wealth[j]);
}
}
if (all_wealth == 0)
return 0;
return all_difference_absolute / ((people_number - 1) * all_wealth);
}
double experiment(int turn = 50000){
srand((unsigned)time(NULL));
std::vector<double> wealth(100, 100);
std::vector<int> has_wealth(100, 1);
for(int i = 0; i < turn; ++i){
for(int j = 0; j < 100; ++j){
if(! wealth[j])
has_wealth[j] = 0;
}
for(int j = 0; j < 100; ++j){
if(! has_wealth[j])
continue;
int random_number = 0;
do{
random_number = (int)(rand() % 100);
}while(random_number == j);
--wealth[j];
++wealth[random_number];
}
}
return this->calculate_gini(wealth);
}
};
int main(){
Solution solution;
printf("Gini: %.4lf\n", solution.experiment());
return 0;
}