matplotlib生成0-40之内符合正态分布的随机数
时间: 2023-10-25 10:18:32 浏览: 193
可以使用numpy和matplotlib库来生成符合正态分布的随机数并绘制直方图。
代码如下:
``` python
import numpy as np
import matplotlib.pyplot as plt
# 生成符合正态分布的随机数
data = np.random.normal(20, 10, 1000)
# 绘制直方图
plt.hist(data, bins=40, density=True, alpha=0.6, color='g')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Normal Distribution')
plt.grid(True)
plt.show()
```
解释一下代码:
- `np.random.normal(20, 10, 1000)` 生成1000个均值为20,标准差为10的正态分布随机数;
- `plt.hist()` 绘制直方图,其中 `bins` 表示分成40个区间, `density=True` 表示归一化, `alpha=0.6` 表示透明度为0.6, `color='g'` 表示颜色为绿色;
- `plt.xlabel()` 和 `plt.ylabel()` 分别是设置 x 轴和 y 轴的标签;
- `plt.title()` 设置图表的标题;
- `plt.grid(True)` 显示网格线;
- `plt.show()` 显示图表。
相关问题
如何使用Python中的numpy库生成符合正态分布的随机数,并进行可视化?
在数据科学中,生成符合特定概率分布的随机数是常见的需求,尤其是在模拟、统计分析或机器学习场景中。使用numpy库的random模块可以帮助我们轻松生成符合多种分布的随机数,包括正态分布。正态分布,也称为高斯分布,是一种非常重要的连续概率分布,在自然界和社会科学中广泛存在。
参考资源链接:[Python概率分布与可视化全解析](https://wenku.csdn.net/doc/4k4exm8xj5?spm=1055.2569.3001.10343)
首先,我们需要了解numpy.random.default_rng()函数,这是numpy 1.17版本后推荐使用的随机数生成器。它提供了一种生成高质量随机数的方法,可以通过传递一个随机数种子来保证随机数的可重复性。
生成符合正态分布的随机数时,我们可以使用Generator类中的normal方法。此方法需要指定均值(mean)和标准差(std)作为参数,均值决定了分布的中心位置,标准差决定了分布的离散程度。以下是一个示例代码:
```python
import numpy as np
import matplotlib.pyplot as plt
# 设置随机数种子以确保结果可复现
rng = np.random.default_rng(seed=0)
# 生成符合标准正态分布(均值为0,标准差为1)的随机数
samples = rng.normal(size=1000)
# 使用直方图可视化随机数分布
plt.hist(samples, bins=30, density=True, alpha=0.6, color='g')
# 绘制理论上的正态分布曲线
x = np.linspace(-4, 4, 100)
p = (1 / np.sqrt(2 * np.pi)) * np.exp(-0.5 * x**2)
plt.plot(x, p, 'k', linewidth=2)
# 添加图表标题和坐标轴标签
plt.title('Normal Distribution')
plt.xlabel('Value')
plt.ylabel('Frequency')
# 显示图表
plt.show()
```
在这段代码中,我们首先生成了1000个符合标准正态分布的随机数,并使用matplotlib的直方图功能对这些随机数进行可视化。直方图的density参数设置为True,使得直方图的y轴表示的是概率密度而非频数,这样我们就可以直观地看到数据符合正态分布的特点。同时,我们还绘制了一个理论上的正态分布曲线,以便与生成的随机数样本进行直观对比。
通过上述步骤,你可以清晰地理解如何使用numpy库生成符合正态分布的随机数,并将其可视化。如果你希望深入了解更多关于numpy中概率分布的应用,可以参考《Python概率分布与可视化全解析》,它提供了一个全面的视图,涵盖了各种连续型和离散型概率分布,包括正态分布在内的详细解释和应用实例。
参考资源链接:[Python概率分布与可视化全解析](https://wenku.csdn.net/doc/4k4exm8xj5?spm=1055.2569.3001.10343)
实现一个生成正态随机数的函数,对应的算法是Marsaglia-Bray 算法,重复题目一的相 关过程,即生成一定数量(1000)个随机数(正态分布),然后用图表示它的分布。
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个正态分布的随机数,并用直方图来表示其分布情况。可以看到,随机数的分布呈现出正态分布的特点,符合预期。
阅读全文