补充代码,计算模拟结果的粒子位置的平均值和标准差。 • 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。
时间: 2024-02-15 17:04:03 浏览: 18
以下是补充的代码:
```python
import math
import random
# 计算 n 重伯努利试验成功概率的理论值
def bernoulli_real(p, n, x):
return math.comb(n, x) * p ** x * (1 - p) ** (n - x)
# 用蒙特卡罗方法计算 n 重伯努利试验成功概率的模拟值
def bernoulli_simu(p, n, x, N):
M = 0
for i in range(N):
successes = 0
for j in range(n):
if random.random() < p:
successes += 1
if successes == x:
M += 1
return M / N
p = 0.5
n = 10
x = 5
N = 100000
# 计算理论值和模拟值
real_prob = bernoulli_real(p, n, x)
simu_prob = bernoulli_simu(p, n, x, N)
print("理论值: ", real_prob)
print("模拟值: ", simu_prob)
```
对于一维随机游走模拟的粒子位置的平均值和标准差,可以使用之前的代码进行计算,其中的 `positions` 列表中的元素就是粒子的位置。
相关问题
在右侧编辑器 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)
在右侧编辑器的 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 表示模拟次数;在每次模拟后,计算出粒子位置的平均值和标准差并返回。
根据提示,在右侧编辑器 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。
下面是实现bernoulli_real和bernoulli_simu函数的代码:
```python
import math
import random
def bernoulli_real(p, n, x):
q = 1 - p
coef = math.factorial(n) / (math.factorial(x) * math.factorial(n - x))
prob = coef * (p ** x) * (q ** (n - x))
return prob
def bernoulli_simu(p, n, x, N):
count = 0
for i in range(N):
successes = sum(random.choices([1, 0], weights=[p, 1-p], k=n))
if successes == x:
count += 1
prob = count / N
return prob
```
其中,bernoulli_real函数根据公式计算 n 重伯努利试验成功概率的理论值,参数p为单次试验的成功概率,n为试验总次数,x为成功试验的总次数。bernoulli_simu函数用蒙特卡罗方法计算 n 重伯努利试验成功概率的模拟值,参数p为单次试验的成功概率,n为试验总次数,x为成功试验的总次数,N为蒙特卡罗方法模拟次数。在每次蒙特卡罗模拟过程中,通过random.choices函数生成n个服从二项分布的随机数,其中权重为p和1-p,如果成功的次数等于x,则计数器加1。最后,概率估计为计数器除以模拟次数N。