Python|如果只给部分人发钱会如何?
昨天写了这一篇,突然想起疫情期间国外的不少国家给穷人发钱的行为,我昨天模拟的是人均发钱,就是每个人都具有均等机会获得放水的那一元,在进行两百万次模拟后,结果还是出现了负资产,晚上睡觉的时候就想,如果我要消灭负资产那怎么办?那就“扶贫”咯,只要这个人可能是负资产,我就给他发一块钱,看看结果会如何?
import random
from pyecharts import Bar
s = [100 for i in range(100)] # 一开始人手100元
v1=s.copy()
for i in range(200000):#执行20万次
for j in range(100):#模拟100个人每次随机给别人一块钱
x=random.randint(0,99)#可以随机给任何一个人
if(s[j]>0):#只给没钱的人发钱,消灭负资产
s[j]-=1 # 假设第j个人随机给别人一块钱
s[x] += 1 # 第j个人的一块钱钱给第x个人
v2=s.sort() #排序
v2=[s[i] for i in range(0,100,2)]+[s[i] for i in range(99,0,-2)]#正太分布
attr = [i+1 for i in range(100)]
bar = Bar("模拟随机给他人一元二十万次的效果", "初始值与最终值")
bar.add("初始值", attr, v1, mark_line=["min", "average", "max"])
bar.add("最终值", attr, v2, mark_line=["min", "average", "max"])
bar.render()
从图中可以看出,放水倍数只翻了3.71倍,但是数据向少数人集中,尝试两百万次后结果也是如此。如果我只给1000元以上的人放水呢?运行二十万次之后数据不忍直视,放水翻了16倍,财富竟然向3个人集中:
哈哈,能不能只向中间的人发钱呢?比如只给收入在300~600之间的人发钱,会怎么样呢?结果放水翻了4.77倍,出现明显的断层了。
那么由这个随机模型,是不是可以得出钱最好发放给穷人呢?哈哈,社会问题当然比数学模型要复杂得多,不能这么简单下结论。不过经过这次模型模拟,给了我一些不一样的启示:我原本以为随机是向平均分配趋势走向的,结果发现是正太分布。然后我又想外力干预究竟会产生怎样的异像,结果完全出乎我的意料,穷人那里加把火几乎不会改变贫富差距,而富人那里加把火不管从放水倍数还是到财富集中都是非常诡异的,为什么连随机数都表现出这样明显的“嫌贫爱富”呢?在给中产阶级放水结果也破坏了正太分布的效果,则产生明显的财富断层。
有人说我们大概率是活在一个虚拟的世界里,有时候想想这奇妙的世界居然有着无数的数形之美,某些方面的发展规律竟然也会自然而然地走向某一数理模型,是不是很神奇呢?正所谓“活到老,学到老”,这个世界真的是奇妙的一种存在值得我们一辈子去探索。当然,我们不能因此而迷信某种超能力,至少我们可以在目前的能力范围之内,可以做一点什么更有意义的行动?推荐阅读《迷信,更应该从心理学角度研究》。
白天写完上面的文字,晚上突然想,既然没有跟踪每一个数据,如何确认随机数确实是“嫌贫爱富”呢?所以晚上决定开始写跟踪数据,代码如下:
import random
from pyecharts import Line
s = [100 for i in range(100)] # 一开始人手100元
t=[[],[],[],[],[],[],[],[],[],[]]
for i in range(200000): # 执行20万次
for id in range(6):
t[id].append(s[id])#记录前6个人
for j in range(100): # 模拟100个人每次随机给别人一块钱
x = random.randint(0, 99) # 可以随机给任何一个人
s[j] -= 1 # 假设第j个人随机给别人一块钱
s[x] += 1 # 第j个人的一块钱钱给第x个人
attr = [i+1 for i in range(200000)]
line = Line("模拟随机给他人一元二十万次的效果", "前6人的财富值变化")
for id in range(6):
xid=id+1
line.add("第"+str(xid)+"个人的财富变化", attr, t[id])
line.render()
本来想模拟10个人的数据,但是太卡了,可能是我电脑太破了,有兴趣的可以自行在电脑里跟踪更多的数据观察规律……6个人运行后的图像如下,一开始并不是特别有规律,也有后来居上的情况,但是整体差距是逐渐发散的。