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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐