基于正态分布指定范围内的随机数生成算法 |
您所在的位置:网站首页 › excel生成标准正态分布的1000个随机数 › 基于正态分布指定范围内的随机数生成算法 |
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? https://stackoverflow.com/questions/36894191/how-to-get-a-normal-distribution-within-a-range-in-numpy [2] How to generate a random normal distribution of integers https://stackoverflow.com/questions/37411633/how-to-generate-a-random-normal-distribution-of-integers [3] Random number within a range based on a normal distribution https://stackoverflow.com/questions/2751938/random-number-within-a-range-based-on-a-normal-distribution [4] python模拟常用分布 https://blog.csdn.net/howhigh/article/details/78007317
转自:https://my.oschina.net/leejun2005/blog/76984 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |