Python中随机漫步的实现

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()

得到的输出结果如下:前100步轨迹

#法二
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步

利用法二得到的输出结果如下:
前100步轨迹
若目标是实现多次随机漫步,比如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进行数据分析》的复现,欢迎交流:)

猜你喜欢

转载自blog.csdn.net/weixin_44457194/article/details/88074478