在右侧编辑器 Begin-End 区间补充代码,实现普通版本和向量化版本的一维随机游走模拟,计算模拟结果的粒子位置的平均值和标准差。 bernoulli_real(p, n, x):根据公式计算并返回 n 重伯努利试验成功概率的理论值,其中,p为单次试验的成功概率,n为试验总次数,x为成功试验的总次数(x<=n); bernoulli_simu(p, n, x, N):用蒙特卡罗方法计算 n 重伯努利试验成功概率的模拟值,其中,p为单次试验的成功概率(0<=p<=1),n为试验总次数,x为成功试验的总次数(x<=n),N为蒙特卡罗方法模拟次数。在每次蒙特卡罗模拟过程中,如果具有概率p的那个结果刚好出现x次,那么称这n次实验是成功的,如果M是N次蒙特卡罗模拟中成功的次数,那么概率估计为M/N.import random from math import factorial def bernoulli_real(p, n, x): ######### Begin ######### return factorial(n)*p**x*(1-p)**(n-x)/(factorial(x)*factorial(n-x)) ########## End ########## def bernoulli_simu(p, n, x, N): ######### Begin ######### ########## End ########## def test_bernoulli_exp(p, n, x, N): real = bernoulli_real(p, n, x) simu = bernoulli_simu(p, n, x, N) print("理论值:%g\t实验结果:%g\t误差:%g" % (real, simu, abs(simu - real))) if __name__ == '__main__': random.seed(10) N = 1000000 test_bernoulli_exp(0.5, 5, 2, N) test_bernoulli_exp(0.3, 10, 3, N) test_bernoulli_exp(0.7, 7, 4, N)
时间: 2024-02-24 13:58:04 浏览: 63
在右侧编辑器的 Begin-End 区间,普通版本和向量化版本的一维随机游走模拟的代码如下:
普通版本:
```
import random
import math
def random_walk_1d(n, s):
position = 0
for i in range(n):
if random.random() < 0.5:
position += 1
else:
position -= 1
return position * s
def simulate_random_walk_1d(n, s, m):
positions = []
for i in range(m):
positions.append(random_walk_1d(n, s))
avg_position = sum(positions) / m
std_dev = math.sqrt(sum([(pos - avg_position)**2 for pos in positions]) / m)
return avg_position, std_dev
if __name__ == '__main__':
n = 1000
s = 0.5
m = 1000
avg_position, std_dev = simulate_random_walk_1d(n, s, m)
print("平均位置:", avg_position)
print("标准差:", std_dev)
```
向量化版本:
```
import random
import math
import numpy as np
def random_walk_1d_vectorized(n, s):
steps = np.random.choice([-1, 1], n)
positions = np.cumsum(steps) * s
return positions[-1]
def simulate_random_walk_1d_vectorized(n, s, m):
positions = np.zeros(m)
for i in range(m):
positions[i] = random_walk_1d_vectorized(n, s)
avg_position = np.mean(positions)
std_dev = np.std(positions)
return avg_position, std_dev
if __name__ == '__main__':
n = 1000
s = 0.5
m = 1000
avg_position, std_dev = simulate_random_walk_1d_vectorized(n, s, m)
print("平均位置:", avg_position)
print("标准差:", std_dev)
```
其中,`random_walk_1d(n, s)` 和 `random_walk_1d_vectorized(n, s)` 分别表示普通版本和向量化版本的一维随机游走模拟函数;`simulate_random_walk_1d(n, s, m)` 和 `simulate_random_walk_1d_vectorized(n, s, m)` 分别表示普通版本和向量化版本的一维随机游走模拟函数的模拟函数,其中,n 表示步数,s 表示步长,m 表示模拟次数;在每次模拟后,计算出粒子位置的平均值和标准差并返回。
阅读全文