Python中随机漫步的实现
本文是对Wes McKinney《利用python进行数据分析》第二版第四章随机漫步代码实现,详见如下
#随机1次漫步,共1000步
#法一
import matplotlib.pyplot as plt
import random
position=0 #定义初始位置
walk=[position] #生成步进walk的列表
for i in range(1000): #1000次循环
step=1 if random.randint(0,1) else -1 #确定每次随机漫步的步数
position+=step #随机步进累积和
walk.append(position)
plt.plot(walk[:100]) #画出前一百步
plt.show()
得到的输出结果如下:
#法二
import numpy as np
draws=np.random.randint(0,2,size=1000) #生成只包含0或1的1*1000的列表
steps=np.where(draws>0,1,-1) #将draws列表的0替换为-1
walk=steps.cumsum() #walk是随机步进累积和的列表
plt.plot(walk[:100])
plt.show()
print(walk.min()) #寻找最小步数
print(walk.max()) #寻找最大步数
print((np.abs(walk)>=10).argmax()) #寻找何时朝某方向首次破10步
利用法二得到的输出结果如下:
若目标是实现多次随机漫步,比如5000次,每次仍步进1000步,则
#模拟5000次随机漫步,每次1000步
ndraws=np.random.randint(0,2,size=(5000,1000)) #生成newdraws列表,维度5000*1000
nsteps=np.where(ndraws>0,1,-1)
walks=nsteps.cumsum(1) #关注列,将各行的每一列累加
print(walks) #一个5000*1000的列表,每一行代表一次随机漫步试验,列则代表1000步数
print(walks.min())
print(walks.max())
hits30=(np.abs(walks)>=30).any(1) #关注列,对各行每一列检查有无>=30的值,any是或运算,返回布尔值
print(hits30) #即检查5000次试验,哪几次有超过30步的,把这几次筛出来
print(hits30.sum()) #判断总共有多少次>=30的试验
crossing_times=(np.abs(walks[hits30])>=30).argmax(1)
print(crossing_times.mean()) #计算平均穿越30步所需要用的步数
几次console的结果如下:
-33
17
17
[[ 1 0 1 ... 40 39 38]
[-1 -2 -1 ... 44 43 44]
[-1 0 -1 ... 6 5 4]
...
[ 1 2 3 ... 16 15 16]
[ 1 2 3 ... 6 5 6]
[ 1 2 3 ... 2 3 4]]
-117
135
[ True True False ... False False False]
3417
507.33128475270706
几段代码是对《利用python进行数据分析》的复现,欢迎交流:)