根据提示,在右侧编辑器 Begin-End 区间补充代码,实现普通版本和向量化版本的一维随机游走模拟,计算模拟结果的粒子位置的平均值和标准差。 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-22 13:56:50 浏览: 158
普通版本实现:
```python
import random
import math
import numpy as np
def random_walk(N, T):
positions = []
for i in range(N):
position = 0
for j in range(T):
if random.random() < 0.5:
position -= 1
else:
position += 1
positions.append(position)
mean = sum(positions) / N
std = math.sqrt(sum((x - mean)**2 for x in positions) / N)
return mean, std
```
向量化版本实现:
```python
import random
import math
import numpy as np
def random_walk_vec(N, T):
steps = np.random.choice([-1, 1], size=(N, T))
positions = np.cumsum(steps, axis=1)
mean = np.mean(positions, axis=0)[-1]
std = np.std(positions, axis=0)[-1]
return mean, std
```
其中,`np.random.choice([-1, 1], size=(N, T))`生成了一个形状为(N,T)的数组,其中每个元素为-1或1,表示每个粒子在每个时间步长所走的方向。`np.cumsum(steps, axis=1)`对这个数组进行累加,得到每个粒子在每个时间步长的位置。最后,分别计算平均值和标准差即可。
完整代码如下:
```python
import random
import math
import numpy as np
def random_walk(N, T):
positions = []
for i in range(N):
position = 0
for j in range(T):
if random.random() < 0.5:
position -= 1
else:
position += 1
positions.append(position)
mean = sum(positions) / N
std = math.sqrt(sum((x - mean)**2 for x in positions) / N)
return mean, std
def random_walk_vec(N, T):
steps = np.random.choice([-1, 1], size=(N, T))
positions = np.cumsum(steps, axis=1)
mean = np.mean(positions, axis=0)[-1]
std = np.std(positions, axis=0)[-1]
return mean, std
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)
```
阅读全文