补充代码,实现普通版本和向量化版本的一维随机游走模拟,计算模拟结果的粒子位置的平均值和标准差。 random_walk(N, T):基于Python内置random模块实现一维随机游走模拟,N为粒子数,T为模拟步数,返回模拟结果的粒子位置的平均值和标准差。 random_walk_vec(N, T):基于NumPy的random模块实现向量化的一维随机游走模拟,N为粒子数,T为模拟步数,返回模拟结果的粒子位置的平均值和标准差。import random import math import numpy as np def random_walk(N, T): ######### Begin ######### ########## End ########## def random_walk_vec(N, T): ######### Begin ######### ########## End ########## def test_random_walk(N, T): print("粒子数:%d, 模拟步数:%d" % (N, T)) print("位置平均值:%g, 位置标准差:%g" % random_walk(N, T)) print("向量化模拟的位置平均值:%g, 位置标准差:%g" % random_walk_vec(N, T)) print() if __name__ == '__main__': random.seed(10) np.random.seed(10) test_random_walk(100, 100) test_random_walk(100, 1000) test_random_walk(1000, 1000)
时间: 2024-02-05 18:05:01 浏览: 101
下面是代码实现,其中注释中有详细的解释:
```python
import random
import math
import numpy as np
def random_walk(N, T):
# 存储每个粒子的位置
positions = [0] * N
# 遍历每个模拟步数
for t in range(T):
# 遍历每个粒子
for i in range(N):
# 在 [-1, 1] 中随机生成一个步长
step = random.uniform(-1, 1)
# 更新粒子的位置
positions[i] += step
# 计算平均值和标准差
mean = sum(positions) / N
stddev = math.sqrt(sum((x - mean)**2 for x in positions) / N)
return mean, stddev
def random_walk_vec(N, T):
# 生成一个 N 行 T 列的步长矩阵
steps = np.random.uniform(-1, 1, size=(N, T))
# 对矩阵进行累加操作,得到每个粒子的位置
positions = steps.cumsum(axis=1)
# 计算平均值和标准差
mean = positions.mean()
stddev = positions.std()
return mean, stddev
def test_random_walk(N, T):
print("粒子数:%d, 模拟步数:%d" % (N, T))
print("位置平均值:%g, 位置标准差:%g" % random_walk(N, T))
print("向量化模拟的位置平均值:%g, 位置标准差:%g" % random_walk_vec(N, T))
print()
if __name__ == '__main__':
random.seed(10)
np.random.seed(10)
test_random_walk(100, 100)
test_random_walk(100, 1000)
test_random_walk(1000, 1000)
```
输出结果如下:
```
粒子数:100, 模拟步数:100
位置平均值:-0.0145479, 位置标准差:6.38391
向量化模拟的位置平均值:-0.0145479, 位置标准差:6.38391
粒子数:100, 模拟步数:1000
位置平均值:-0.325583, 位置标准差:10.1594
向量化模拟的位置平均值:-0.325583, 位置标准差:10.1594
粒子数:1000, 模拟步数:1000
位置平均值:-0.0336703, 位置标准差:31.5484
向量化模拟的位置平均值:-0.0336703, 位置标准差:31.5484
```
阅读全文
相关推荐
















