模拟社会财富分配问题:房间内有 100 人,每人有 100 块,每分钟随机 给另一个人 1 块钱,最后这个房间内的财富分布怎样

这是一个非常有趣的问题,可以大致模拟社会财富的分配情况。我们做出如下进一步的思考

我们不妨把这场游戏视作在一颗叫做“埃博拉”的遥远星球上社会运 行和财富分配的简化模型,从而模拟这个世界的运行规律。我们假设:
• 每个人在18岁带着100元的初始资金开始玩游戏,
• 每天玩一次,一直玩到80岁的人均寿命。
• “每天拿出一元钱”可理解为基本的日常消费“获得财富的概率也是完全随机
这颗星球上普通智慧生命的平均寿命80岁;那么一生要玩20000次游 戏,即获得20000次财富分配的机会!

既然要模拟社会运行情况,所以我们再加入如下几个基本角色。
1、投资者:每年财富增长3%
2、投机者:即使财富情况为负值,依然消费。
3、奋斗者:获得财富的概率比平常人多1%
4、普通人:当手中财富变为0时,不再消费,但是仍然可以获得财富

在开始计算之前先把几种角色的属性初始化一下

id=[i for i in range(1,101)]#初始化编号
fortune=[100 for i in range(100)]#初始化财富
roles=['奋斗者','投资者','投机者','普通人']#角色
role=['奋斗者']*10+['投资者']*10+['投机者']*10+['普通人']*70
color=['orange']*10+['r']*10+['g']*10+['gray']*70#每种角色对应一种颜色
p_value=[0.0101]*10+[0.899/90]*90#初始化获得财富的概率

df=pd.DataFrame({
    'id':id,
    'fortune':fortune,
    'role':role,
    "p":p_value,
    'color':color
})

计算思路比较简单,不用过多解释(代码在最后),(Pandas的基本操作可以参看这篇博客)初始化完成后利用pandas的一些基本操作就能解决。我们直接看可视化的结果。
在这里插入图片描述

在这里插入图片描述
通过结果可以直观地看到,60年后,投资者的收益是最大的,其次是奋斗者,随后便是普通人和投机者。
投资者的总体财富要远高于财富第二多的奋斗者。由此我们可以暂时得出结论,努力奋斗的结果一定比不努力强,适当学会理财可以比实现收益的翻倍,当然了,投资还需谨慎,如图结果所示就有个投资不谨慎的家伙(实际 上出现这种的原因是没有对投资者的负债情况进行处理,当然,把这理解为投资失败的情况也无妨)。
在这里插入图片描述
结果仅供参考,这只是一个最简单的模拟情况。
实际上还可以加入元素比如:学习者(开始获得财富的概率很低,随着时间的变长,获得财富的概率随之增长)、低收入人群(支出与获得都很少,当低到一定程度时,政府介入提供低保)、生老病死(设置随机数,移除一个或者增加一个等。。。。。)源代码如下:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import random
import seaborn as sb
import warnings
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus'] = False


id=[i for i in range(1,101)]
fortune=[100 for i in range(100)]#初始化财富
roles=['奋斗者','投资者','投机者','普通人']
role=['奋斗者']*10+['投资者']*10+['投机者']*10+['普通人']*70
color=['orange']*10+['r']*10+['g']*10+['gray']*70
p_value=[0.0101]*10+[0.899/90]*90#初始化概率

df=pd.DataFrame({
    'id':id,
    'fortune':fortune,
    'role':role,
    "p":p_value,
    'color':color
})


rounds=20000#设置迭代次数
for i in range(rounds):
    if(i%365==0):#每年投资者的收益增加
        index=df[df['role']=='投资者'].index
        df.loc[index,'fortune']=df.loc[index,'fortune']*1.03
    for j in range(100):#遍历每个人
        df['fortune'][j]= df['fortune'][j]-1#
        
        while(True):
            r1=np.random.choice(df['id'],p=df['p'])-1
            if(r1!=j):
                break
        df.iloc[r1,1]+=1
    index0=df.loc[(df['role']=='普通人') & (df['fortune']<0)].index#找到普通人资产小于0的部分
    df.loc[index0,'fortune']=0
    print("\r模拟进度:{:.2f}%".format((i+1)/rounds*100),end=" ",flush=True)
df=df.sort_values(by='fortune').reset_index()

#可视化
plt.figure(figsize=(12,8))
plt.title("迭代{}次后结果".format(rounds))
plt.bar(np.arange(len(df)),df['fortune'],color=df['color'],label=df['role'])

#绘制图例
r1=plt.Rectangle((0,0),1,1,fc="orange", edgecolor = 'none') 
r2=plt.Rectangle((0,0),1,1,fc='r',  edgecolor = 'none')
r3=plt.Rectangle((0,0),1,1,fc='g',  edgecolor = 'none')
r4=plt.Rectangle((0,0),1,1,fc='gray',  edgecolor = 'none')
plt.legend([r1,r2,r3,r4], roles)
plt.ylabel("财富")
plt.savefig('res1.jpg')

plt.title('各类型人的平均财富情况')
sb.barplot(df.role,df.fortune,errwidth=0,order=roles)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Demonslzh6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值