今天逛知乎,无意间看到这么一个问题,最近刚好在学习python,就试着模拟一下。
思路
- 用长度为100,元素值都为1的数组模拟房间里的100个人,
- 从编号0到99依次对元素值减一,并随机获取一个元素使其加一,完成一次循环A。
- 多次执行A操作,即可模拟问题
代码实现
尽量添加了过多的注释,希望小白也能读懂
# -*- coding: UTF-8 -*-
import random
import numpy as np
import matplotlib as mpl
mpl.use('TkAgg')
import matplotlib.pyplot as plt
print(mpl.get_backend())
from matplotlib.animation import FuncAnimation # 动图的核心函数
# 生成集合100人集合方法,编号从0到99,每人拥有1元钱,即y轴数据
def create():
l = []
for i in range(0, 100):
l.append(1)
return l
l = create() # 100人集合赋值给l
fig = plt.figure()
ax = fig.add_subplot(111)
# x轴数据
x = np.arange(0, 100)
bar = ax.bar(x, l)
def animat(i):
# 内层循环,从0-99编号的人依次随机给集合内的人一块钱,如果当前个人所拥有的财富为0,则跳过,下一个人继续
for index in range(0, 100):
# 获取当前需要出钱人的总资产
set_item = l[index]
# 如果他总资产等于0,则跳过,继续下一个人
# 如果不等于零,则资产减一
if set_item == 0:
continue
else:
l[index] = set_item - 1
# 通过系统获取一个0-99的随机数
get_random_index = random.randint(0, 99)
# 指定随机数编号的人资产加一
l[get_random_index] = l[get_random_index] + 1
plt.cla()
bar = ax.bar(x, l)
plt.title(str(i))
plt.ylim((0, 10))
return bar
# 动画实现
ani = FuncAnimation(fig=fig, func=animat, frames=1000, blit=False)
# 输出图形
plt.show()
-
结果展示(上面的那个数字是当前循环的次数)
-
运行100000次之后,上图为未排序的结果,下图为排序结果
结果
个人认为,越极端(财富极多,极小的情况由于为零就不操作,则不考虑)的概率越小,大概率趋向正太分布
财富小于零时可以继续操作的情况
-
代码就不贴了直接看结果
- 基本符合正太分布,越趋向于0(1?)数据越多,趋向于两边极端数据越少。
结束
- 结果只是猜想,并未证实
- 主要为了练习下python解决问题的能力