社会资金流是持续而有目的性的,你是否曾想过,为何富人会出现,穷人又为何会出现?穷人和富人究竟如何形成,是否努力就一定能获得成功,赢得更多金钱?今天,让我们用python代码,来模拟一个小社会,看看财富的分配到底是怎样的。
游戏规则:
房间里有100个人,每人都有100元钱,他们在玩一个游戏。每轮游戏中,每个人都要拿出一元钱随机给另一个人,最后这100个人的财富分布是怎样的?
游戏一:没有借贷的社会
1.1 模型假设
每个人初始基金100元
从18岁到65岁,每天玩一次,简化运算按照一共玩17000轮
每天拿出一元钱,并且随机分配给另一个人
当某人的财富值降到0元时,他在该轮无需拿出1元钱给别人,但仍然有机会得到别人给出的钱
游戏一,我们假设分配到财富值为0时可不用出钱,可看做社会前期,没有借贷的日子。
1.2 搭建模型
1.2.1 导入所需函数库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import time
import warnings
warnings.filterwarnings('ignore')
# 不发出警告
1.2.2 第一轮游戏
第一轮游戏,先不考虑某人财富值会出现0元或以下的情况,这里是100轮内。
person_n = [x for x in range(1,101)]
fortune = pd.DataFrame([100 for i in range(100)], index = person_n)
fortune.index.name = 'id'
# 设定初始参数:游戏玩家100人,起始资金100元
round_r1 = pd.DataFrame({'pre_round':fortune[0],'lost':1})
# 设定第一轮分配财富之前的情况
choice_r1 = pd.Series(np.random.choice(person_n,100))
gain_r1 = pd.DataFrame({'gain':choice_r1.value_counts()})
# 这一轮中每个人随机指定给“谁”1元钱,并汇总这一轮每个人的盈利情况
round_r1 = round_r1.join(gain_r1)
round_r1.fillna(0,inplace = True)
fortune[1] = round_r1['pre_round'] - round_r1['lost'] + round_r1['gain']
# 合并数据,得到这一轮每个人“盈亏”多少钱 → 得到这一轮财富分配的结果
数据展示
1.2.3 第二轮游戏
第二轮游戏,需要考虑当某人财富值降到0元时,他在本轮无需拿出1元,同时可以有机会拿到1元。
person_n = [x for x in range(1,101)]
fortune = pd.DataFrame([100 for i in range(100)], index = person_n)
fortune.index.name = 'id'
# 设定初始参数:游戏玩家100人,起始资金100元
round_r1 = pd.DataFrame({'pre_round':fortune[0],'lost':0})
round_r1['lost'][round_r1['pre_round'] > 0] = 1
# 设定第一轮分配财富之前的情况 → 该轮财富值为0的不需要拿钱给别人
round_players = round_r1[round_r1['pre_round'] > 0]
# 筛选出参与游戏的玩家:财富值>0
choice_r1 = pd.Series(np.random.choice(person_n,len(round_players)))
gain_r1 = pd.DataFrame({'gain':choice_r1.value_counts()})
# 这一轮中每个人随机指定给“谁”1元钱,并汇总这一轮每个人的盈利情况
round_r1 = round_r1.join(gain_r1)
round_r1.fillna(0,inplace = True)
fortune[1] = round_r1['pre_round'] - round_r1['lost'] + round_r1['gain']
# 合并数据,得到这一轮财富分配的结果
1.2.4 构建模型
把前两轮游戏汇总成一个函数模型
def game1(data, roundi):
if len(data[data[roundi - 1] ==0]) > 0:
# 当数据包含财富值为0的玩家时
round_i = pd.DataFrame({'pre_round':data[roundi-1],'lost':0})
con = round_i['pre_round'] > 0
round_i['lost'][con] = 1 # 设定每轮分配财富之前的情况 → 该轮财富值为0的不需要拿钱给别人
round_players_i = round_i[con] # 筛选出参与游戏的玩家: