基于正态分布指定范围内的随机数生成算法
1、需求背景生成一个范围(n到m,例如100到150)的随机数,但不是纯粹随机(均匀分布)的,想要的结果是基于正态分布。另外想要数字“聚集”在125左右。生成符合正太分布的随机数不难,但是如何达到我所要求的范围?2、分析与代码标准正态分布的平均值为0,标准差为1;如果要使用均值m和偏差进行分布s,只需乘以s,然后加m。由于理论上的正态分布是无限的,因此如果不明确拒绝超出范围的数字,就无法对范围(例
1、需求背景
生成一个范围(n到m,例如100到150)的随机数,但不是纯粹随机(均匀分布)的,想要的结果是基于正态分布。另外想要数字“聚集”在125左右。
生成符合正太分布的随机数不难,但是如何达到我所要求的范围?
2、分析与代码
标准正态分布的平均值为0,标准差为1;如果要使用均值m和偏差进行分布s,只需乘以s,然后加m。由于理论上的正态分布是无限的,因此如果不明确拒绝超出范围的数字,就无法对范围(例如100到150)进行硬性限制,但是可以通过适当选择偏差来确保(例如)您的数字的99%将在此范围内。
大约99.7%的总数处于+/- 3个标准差之内(3σ),因此,如果您选择的是大约(25/3 == 3σ),则它应能正常工作。
所以你想要像这样的东西: (normal * 8.333) + 125 (标准正态分布变换到正态分布)
import numpy as np
import matplotlib.pyplot as plt
from math import sqrt
# # bi = np.random.binomial(n=100, p=0.5, size=200)
# n = np.random.normal(100*0.5, sqrt(100*0.5*0.5), size=500)
# #
# # plt.hist(bi, bins=20, normed=True);
# plt.hist(n, alpha=0.5, bins=20, normed=True);
# plt.show();
# print()
from scipy.stats import truncnorm
def get_truncated_normal(mean=0, sd=1, low=0, upp=10):
return truncnorm(
(low - mean) / sd, (upp - mean) / sd, loc=mean, scale=sd)
X1 = get_truncated_normal(mean=2, sd=1, low=1, upp=10)
X2 = get_truncated_normal(mean=5.5, sd=1, low=1, upp=10)
X3 = get_truncated_normal(mean=5000, sd=1000, low=1000, upp=10000)
import matplotlib.pyplot as plt
fig, ax = plt.subplots(3, sharex=True)
ax[0].hist(X1.rvs(10000), normed=True)
ax[1].hist(X2.rvs(10000), normed=True)
_ = X3.rvs(100000)
ax[2].hist(_, normed=True)
plt.show()
np.savetxt("result.txt", [int(j) for j in _], fmt='%d');
3、数据验证
Refer:
[1] How to get a normal distribution within a range in numpy?
[2] How to generate a random normal distribution of integers
[3] Random number within a range based on a normal distribution
[4] python模拟常用分布
https://blog.csdn.net/howhigh/article/details/78007317
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)