赞
踩
构建财富分配模型,模拟不允许借贷情况下的财富分配,允许借贷下的财富分配,努力型人生的财富分配
1、财富分配模型 模型假设: ① 每个人初始基金100元 ② 从18岁到65岁,每天玩一次,简化运算按照一共玩17000轮 ③ 每天拿出一元钱,并且随机分配给另一个人 ④ 当某人的财富值降到0元时,他在该轮无需拿出1元钱给别人,但仍然有机会得到别人给出的钱 要求: ① 构建模型模拟(这里需要跑17000轮) ② 绘制柱状图,查看该轮财富情况 ③ 查看最后财富分配数据是什么分布? ④ 最富有的人相比于初始财富,翻了多少倍? ⑤ 10%的人掌握着多少的财富?30%的人掌握着多少的财富?又有百分之多少人财富缩水至100元以下了? 2、在允许借贷情况下,研究以下问题 和初始模型的区别: 允许借贷意味着可以找亲友、银行、投资人借贷 → 资产为负时,仍然参与游戏 要求: ① 构建模型模拟,再次模拟财富分配情况 ② 绘制柱状图,查看该轮财富情况 ③ 游戏次数与财富分布的标准差的情况,绘图来表示 ④ 玩家从18岁开始,在经过17年后为35岁,这个期间共进行游戏6200次左右,则此刻查看财富情况,将财富值为负的标记成“破产”,通过图表研究 该类玩家在今后的游戏中能否成功“逆袭”(财富值从负到正为逆袭) 3、努力的人生会更好吗? 模型假设: ① 每个人初始基金仍为100元 ② 一共玩17000轮 ③ 每天拿出一元钱,并且随机分配给另一个人 ④ 有10个人加倍努力,从而获得了1%的竞争优势 ⑤ 允许借贷 要求: ① 构建模型模拟,再次模拟财富分配情况 ② 努力的人,最后是否富有? ③ 绘制柱状图,查看该轮财富情况
1.首先构建模型的假设,这里有四个假设,根据这四个假设,使用随机数来模拟给钱和得到钱。首先模拟第一轮的财富分配,
然后扩展到多轮的分配,不考虑借贷的情况,使用for循环来进行多轮分配,并绘制柱状图,查看指定轮的财富情况
2.考虑借贷情况下构建模型,这里增加一个假设:当财富为0时可以向他人借贷继续游戏,即允许财富值为负数。通过多轮模拟情况研究一个问题,
即当玩家财富为负之后有多大可能变为正数。这里采用颜色标记的方法,在玩家为35岁时,将财富为负数的玩家标记为红色,然后查看红色标记的变迁情况。
3.这里在允许借贷的情况下再增加一个假设:如果有人的人生更加努力,竞争优势增加1%。在增加这个假设的情况下构建模型来模拟财富分配,
一次来研究努力型的人生是否可以获得更加多的财富
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import time
import warnings
warnings.filterwarnings('ignore')
start_time = time.time()
#模拟第一轮游戏分配,不考虑财富降到零的情况
person_n = [x for x in range(1,101)] #模拟100人Id
fortune = pd.DataFrame([100 for i in range(100)],index =person_n ) #初始财富状况
fortune.index.name = 'id' #重命名index
round_r1 = pd.DataFrame({
'pre_round':fortune[0],'lost':1}) #第一轮每个人拿出一块钱
choice_r1 = pd.Series(np.random.choice(person_n,100)) #100块对100人做随机分配
gain_r1 = pd.DataFrame({
'gain':choice_r1.value_counts()}) #计算随机分配后的获利情况
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'] #第一轮分配后的财富情况
print(fortune)
#模拟第一轮游戏分配,考虑财富降到零的情况
#过程与不考虑财富到零的情况大致相同
person_n = [x for x in range(1,101)]
fortune1 = pd.DataFrame([100 for i in range(100)],index =person_n )
fortune1.index.name = 'id'
round_r1 = pd.DataFrame({
'pre_round':fortune1[0],'lost':1})
#判断前一轮分配后是否有人财富为0,若为0,则本次分配不需要支出1元,即支出为0
for i in range(1,101):
if round_r1.loc[i,'pre_round'] ==0:
round_r1.loc[i,'lost']=0
#计算本轮分配金额分配给100人
choice_r1 = pd.Series(np.random.choice(person_n,round_r1['lost'].sum()))
#计算随机分配后的获利情况
gain_r1 = pd.DataFrame({
'gain':choice_r1.value_counts()})
round_r1 = round_r1.join(gain_r1)
round_r1.fillna(0,inplace = True)
#计算本轮分配后的财富情况
fortune1[1] = round_r1['pre_round']-round_r1['lost']+round_r1['gain']
print(fortune)
#① 构建模型模拟(这里需要跑17000轮)'
#创建财富分配模型 ---初始模型
def fortune_game1(r):
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'
for i in range(1,r+1):
round_r = pd.DataFrame({
'pre_round':fortune[i-1],'lost':1})
f

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。