实现一个生成正态随机数的函数,对应的算法是Marsaglia-Bray 算法,重复题目一的相 关过程,即生成一定数量(1000)个随机数(正态分布),然后用图表示它的分布。
时间: 2024-05-01 08:16:16 浏览: 12
Marsaglia-Bray算法是一种生成正态分布随机数的方法,基于Box-Muller算法,但是更加高效。具体实现如下:
1. 生成两个均匀分布随机数 $u_1$ 和 $u_2$,范围为 [0,1]。
2. 计算 $v_1 = 2u_1 - 1$ 和 $v_2 = 2u_2 - 1$。
3. 计算 $w = v_1^2 + v_2^2$。
4. 如果 $w > 1$,则返回第1步,重新生成 $u_1$ 和 $u_2$。
5. 计算 $z_1 = v_1 \sqrt{\frac{-2\ln w}{w}}$ 和 $z_2 = v_2 \sqrt{\frac{-2\ln w}{w}}$。
6. 返回 $z_1$ 或 $z_2$。
以下是实现代码:
```python
import numpy as np
import matplotlib.pyplot as plt
def marsaglia_bray(mu, sigma, size):
x = np.zeros(size)
i = 0
while i < size:
u1, u2 = np.random.rand(2)
v1, v2 = 2*u1 - 1, 2*u2 - 1
w = v1**2 + v2**2
if w <= 1:
z1 = v1 * np.sqrt(-2*np.log(w)/w)
z2 = v2 * np.sqrt(-2*np.log(w)/w)
x[i], x[i+1] = z1*sigma + mu, z2*sigma + mu
i += 2
return x
mu, sigma = 0, 1
size = 1000
x = marsaglia_bray(mu, sigma, size)
plt.hist(x, bins=50, density=True)
plt.show()
```
运行代码可以生成1000个正态分布的随机数,并用直方图来表示其分布情况。可以看到,随机数的分布呈现出正态分布的特点,符合预期。