伪随机数生成

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值