import numpy as np
#伪随机数生成
samples = np.random.normal(size = (4,4))#4*4正态分布数组
samples
array([[-1.5229485 ,  0.77679543,  1.52695935,  1.20236513],
       [-0.47239924, -1.44597446,  0.53760123, -1.41085789],
       [-1.47101701,  0.87100219, -0.3450734 , -0.08409622],
       [ 1.12957323, -0.60525586, -0.07127617,  1.30273091]])
from random import normalvariate
N = 10000
%timeit samples = [normalvariate(0,1)for _ in range(N)]
22.1 ms ± 2.79 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.random.normal(size=N)
621 µs ± 33.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
np.random.seed(1234)     #伪随机数生成种子
rng = np.random.RandomState(1234)  #创建隔离的随机数生成器
rng.randn(10)
array([ 0.47143516, -1.19097569,  1.43270697, -0.3126519 , -0.72058873,
        0.88716294,  0.85958841, -0.6365235 ,  0.01569637, -2.24268495])
#随机漫步
#从0开始,步长1和-1出现的概率相等
import random
import matplotlib.pyplot as plt
position = 0
walk = [position]
steps = 1000
for i in range(steps):
    step = 1 if random.randint(0,1) else -1
    position += step
    walk.append(position)
plt.plot(walk[:100])
[<matplotlib.lines.Line2D at 0x1c0679c3978>]

伪随机数生成

nsteps = 1000
draws = np.random.randint(0,2,size = nsteps)
steps = np.where(draws>0,1,-1)
walk = steps.cumsum()
walk.min()
0
walk.max()
55
#随机漫步过程中第一次到达某个特定值的时间
(np.abs(walk)>=10).argmax() # np.abs(walk)>=10可以得到一个布尔型数组,它表示的是距离是否达到或超过10,而我们想要知道的是第一个10或-10的索引。可以用argmax来解决这个问题,它返回的是该布尔型数组第一个最大值的索引(True就是最大值)
13
#一次模拟多个随机漫步
nwalks = 5000
nsteps = 1000
draws = np.random.randint(0,2,size = (nwalks,nsteps))
steps = np.where(draws>0,1,-1)
walks = steps.cumsum(1)
walks
array([[  1,   2,   3, ..., -26, -27, -28],
       [ -1,  -2,  -3, ..., -12, -13, -12],
       [  1,   0,   1, ...,  46,  45,  44],
       ...,
       [ -1,  -2,  -3, ...,  32,  33,  34],
       [ -1,   0,   1, ...,  -6,  -5,  -4],
       [ -1,  -2,  -1, ..., -18, -19, -18]], dtype=int32)
walk.max()
55
walks.min()
-128
hits30 = (np.abs(walks)>=30).any(1)
hits30
array([ True,  True,  True, ...,  True, False,  True])
hits30.sum()
3367
crossing_times = (np.abs(walks[hits30]) >= 30).argmax(1)
crossing_times.mean()
510.07157707157705

相关文章: