Ghi*_*ADJ 19 python random numpy
如何生成一个随机整数np.random.randint()
,但是正态分布在0左右.
np.random.randint(-10, 10)
返回具有离散均匀分布的整数
np.random.normal(0, 0.1, 1)
返回具有正态分布的浮点数
我想要的是两种功能之间的一种组合.
ayh*_*han 25
获得看起来像正态分布的离散分布的另一种可能方式是从多项分布中绘制,其中概率是从正态分布计算的.
import scipy.stats as ss
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 11)
xU, xL = x + 0.5, x - 0.5
prob = ss.norm.cdf(xU, scale = 3) - ss.norm.cdf(xL, scale = 3)
prob = prob / prob.sum() #normalize the probabilities so their sum is 1
nums = np.random.choice(x, size = 10000, p = prob)
plt.hist(nums, bins = len(x))
Run Code Online (Sandbox Code Playgroud)
在这里,np.random.choice
从[-10,10]中选择一个整数.选择元素(例如0)的概率由p(-0.5 <x <0.5)计算,其中x是平均零和标准差3的正态随机变量.I chooce std.开发.因为这样,p(-10 <x <10)几乎为1.
结果如下:
bak*_*kal 12
可以从截断的正态分布生成类似的分布,该分布被四舍五入为整数.这是scipy的truncnorm()的一个例子.
import numpy as np
from scipy.stats import truncnorm
import matplotlib.pyplot as plt
scale = 3.
range = 10
size = 100000
X = truncnorm(a=-range/scale, b=+range/scale, scale=scale).rvs(size=size)
X = X.round().astype(int)
Run Code Online (Sandbox Code Playgroud)
让我们看看它的样子
bins = 2 * range + 1
plt.hist(X, bins)
Run Code Online (Sandbox Code Playgroud)
此处接受的答案有效,但我尝试了 Will Vousden 的解决方案,并且效果很好:
import numpy as np
# Generate Distribution:
randomNums = np.random.normal(scale=3, size=100000)
randomInts = np.round(randomNums)
# Plot:
axis = np.arange(start=min(randomInts), stop = max(randomInts) + 1)
plt.hist(randomInts, bins = axis)
Run Code Online (Sandbox Code Playgroud)