python怎样生成正太分布的随机数?

Python026

python怎样生成正太分布的随机数?,第1张

一般的正态分布可以通过标准正态分布配合数学期望向量和协方差矩阵得到。

格式为:numpy.random.randn(d0, d1, ..., dn)

Python使用Mersenne Twister为核心的生成器,它会生成53 bit精度的浮点值,周期为2的19937次方减1,底层的C语言实现是快速和线程安全的.

用python生成随机的15行6列的随机数据的方法如下:

1.import numpy as np # 定义从正态分布中获取随机数的函数 def get_normal_random_number(loc, scale): """ :param loc: 正态分布的均值 :param scale: 正态分布的标准差 :return:从正态分布中产生的随机数 """ # 正态分布中的随机数生成 number = np.random.normal(loc=loc, scale=scale) # 返回值 return number # 主模块 if __name__ == "__main__": # 函数调用 n = get_normal_random_number(loc=2, scale=2) # 打印结果 print(n) # 结果:3.275192443463058

2 从给定参数的均匀分布中获取随机数的函数

考虑从均匀分布中获取随机数的时候,要事先知道均匀分布的下界和上界,然后调用Numpy模块的random.uniform函数生成随机数。

import numpy as np # 定义从均匀分布中获取随机数的函数 def get_uniform_random_number(low, high): """ :param low: 均匀分布的下界 :param high: 均匀分布的上界 :return: 从均匀分布中产生的随机数 """ # 均匀分布的随机数生成 number = np.random.uniform(low, high) # 返回值 return number # 主模块 if __name__ == "__main__": # 函数调用 n = get_uniform_random_number(low=2, high=4) # 打印结果 print(n) # 结果:2.4462417140153114

3 按照指定概率生成随机数

有时候我们需要按照指定的概率生成随机数,比如已知盒子中每种颜色的球的比例,猜测下一次取出的球的颜色。在这里介绍的问题和上面的例子相似,要求给定一个概率列表,从列表对应的数字列表或区间列表中生成随机数,分两部分讨论。

作者:采石工

链接:https://www.zhihu.com/question/39823283/answer/115241445

来源:知乎

著作权归作者所有,转载请联系作者获得授权。

一般的正态分布可以通过标准正态分布配合数学期望向量和协方差矩阵得到。如下代码,可以得到满足一维和二维正态分布的样本。希望有用,如有错误,欢迎指正!

# coding=utf-8

import numpy as np

from numpy.linalg import cholesky

import matplotlib.pyplot as plt

sampleNo = 1000

# 一维正态分布

# 下面三种方式是等效的

mu = 3

sigma = 0.1

np.random.seed(0)

s = np.random.normal(mu, sigma, sampleNo )

plt.subplot(141)

plt.hist(s, 30, normed=True)

np.random.seed(0)

s = sigma * np.random.randn(sampleNo ) + mu

plt.subplot(142)

plt.hist(s, 30, normed=True)

np.random.seed(0)

s = sigma * np.random.standard_normal(sampleNo ) + mu

plt.subplot(143)

plt.hist(s, 30, normed=True)

# 二维正态分布

mu = np.array([[1, 5]])

Sigma = np.array([[1, 0.5], [1.5, 3]])

R = cholesky(Sigma)

s = np.dot(np.random.randn(sampleNo, 2), R) + mu

plt.subplot(144)

# 注意绘制的是散点图,而不是直方图

plt.plot(s[:,0],s[:,1],'+')

plt.show()