今天逛知乎擂涛,無意間看到這么一個問題读串,最近剛好在學習python,就試著模擬一下撒妈。
思路
- 用長度為100恢暖,元素值都為1的數(shù)組模擬房間里的100個人,
- 從編號0到99依次對元素值減一狰右,并隨機獲取一個元素使其加一杰捂,完成一次循環(huán)A。
- 多次執(zhí)行A操作棋蚌,即可模擬問題
代碼實現(xiàn)
盡量添加了過多的注釋琼娘,希望小白也能讀懂
# -*- 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 # 動圖的核心函數(shù)
# 生成集合100人集合方法,編號從0到99,每人擁有1元錢,即y軸數(shù)據(jù)
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軸數(shù)據(jù)
x = np.arange(0, 100)
bar = ax.bar(x, l)
def animat(i):
# 內(nèi)層循環(huán)附鸽,從0-99編號的人依次隨機給集合內(nèi)的人一塊錢脱拼,如果當前個人所擁有的財富為0,則跳過坷备,下一個人繼續(xù)
for index in range(0, 100):
# 獲取當前需要出錢人的總資產(chǎn)
set_item = l[index]
# 如果他總資產(chǎn)等于0熄浓,則跳過,繼續(xù)下一個人
# 如果不等于零省撑,則資產(chǎn)減一
if set_item == 0:
continue
else:
l[index] = set_item - 1
# 通過系統(tǒng)獲取一個0-99的隨機數(shù)
get_random_index = random.randint(0, 99)
# 指定隨機數(shù)編號的人資產(chǎn)加一
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
# 動畫實現(xiàn)
ani = FuncAnimation(fig=fig, func=animat, frames=1000, blit=False)
# 輸出圖形
plt.show()
-
結果展示(上面的那個數(shù)字是當前循環(huán)的次數(shù))
-
運行100000次之后,上圖為未排序的結果赌蔑,下圖為排序結果
結果
個人認為,越極端(財富極多竟秫,極小的情況由于為零就不操作娃惯,則不考慮)的概率越小,大概率趨向正太分布
財富小于零時可以繼續(xù)操作的情況
-
代碼就不貼了直接看結果
- 基本符合正太分布肥败,越趨向于0(1趾浅?)數(shù)據(jù)越多愕提,趨向于兩邊極端數(shù)據(jù)越少。
結束
- 結果只是猜想皿哨,并未證實
- 主要為了練習下python解決問題的能力