人生苦短,我用python
富人是天生的吗??知乎上有这么样一样财富分配游戏:
一个财富分配游戏:
房间里有100个人,每人都有100元钱,他们在玩一个游戏。每轮游戏中,每个人都要拿出一元钱随机给另一个人,最后这100个人的财富分布是怎样的?
这里用python来模拟一下,主要的思想是蒙特·卡罗方法。
先思考一下这个模拟应该如何进行,首先我们得有一个原始的数据就是有100个人,每个人有100元,然后需要做的就是让每个人拿出1元钱,再然后将这拿出来的前随机分配给其他人,(共3个步骤)最后观察结果。
这里有两个问题:
1.“最后”是指什么时候?
2.如果这个人没有钱了,游戏怎么进行?
既然是模拟社会财富分配,我们按照尽可能实际的方式去思考,假如是财富积累是从人18岁成年开始算起,到65岁算结束,每天进行一轮游戏,一共是17000轮游戏(取整简化)。当然一个人没钱的时候,真实世界是存在借贷的,所以当一个人没钱了之后还可以参与游戏,但是他的财富将为负值。
解决了这两个问题我们可以开始进行游戏了。
先导入工具包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import time
import os
os.chdir('C:\\Users\\xxxxx\\')#设置默认路径
import warnings
warnings.filterwarnings('ignore')
##这里由于要存储最后的图片所以设置了默认路径
第一步:原始的数据就是有100个人,每个人有100元(初始财富)
id_n = [x for x in range(1,101)]
fortune = pd.DataFrame([100 for i in range(100)],index = id_n)
fortune.index.name = 'id'
fortune.head(10)
初始财富
第二步:每个人都要拿出一元钱(参与游戏)
round_r1 = pd.DataFrame({'pre_round':fortune[0],'lost':1})
round_r1.head(10)
每人lost一元钱
第三步:随机给另一个人(参照游戏规则)
choice_r1 = pd.Series(np.random.choice(id_n,100))#对应id_n随机选择100个对象
gain_r1 = pd.DataFrame({'gain':choice_r1.value_counts()})#根据选择对象,看1元钱随机分给了谁
gain_r1.head(10)
左列为被选择的对象,右列获得的财富(即刚刚随机选择中被选中的次数)
看结果
round_r1 = round_r1.join(gain_r1)
round_r1.fillna(0,inplace = True)#刚刚存在有的人没有获得收入,将空值替换为0
fortune[1] = round_r1['pre_round']+round_r1['gain']-round_r1['lost']
fortune.head(20)
第一轮结果
构建函数,模拟17000次
def game(data,roundi):
roundi = pd.DataFrame({'pre_round':data[roundi-1],'lost':1})
choicei = pd.Series(np.random.choice(id_n,len(roundi)))
gaini = pd.DataFrame({'gain':choicei.value_counts()})
roundi = roundi.join(gaini)
roundi.fillna(0,inplace = True)
return roundi['pre_round']+roundi['gain']-roundi['lost']
#初始财富
id_n = [x for x in range(1,101)]
fortune = pd.DataFrame([100 for i in range(100)],index = id_n)
fortune.index.name = 'id'
#进行17000轮游戏
for round in range(1,17001):
fortune[round] = game2(fortune,round)
game2_result = fortune.T#转置列表,方便查看数据
game2_result.tail()
最后5轮结果
graph3_round_17000.png
最后一轮中,最富有的人财富值为455元,相比于初始财富,翻了4.55倍。10%的人掌握着30%左右的财富,20%的人掌握着60%左右的财富,50%的人财富缩水至100元以下了。初始财富相同,有的人变成了富翁,有的人靠借钱度日,也许冥冥之中有很多运气在里面,但是不管如何模拟出来的结果符合社会财富呈现出“28定律”,而且一个人的消费就是另一个人收入,社会的经济就是这样慢慢变化的。
最后推荐一个视频:《经济机器是如何运行的》是著名的桥水基金的创始人Ray Dalio讲述的,内容浅显易懂深入浅出,推荐给大家。
网友评论