如何生成一个随机的整数正态分布

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.

结果如下:

在此输入图像描述

  • 对于连续分布,P(x = 0)= 0(对于任何其他数字都是如此).概率是针对间隔定义的.这里,为了将概率与0(和其他整数)相关联,我使用了区间(-0.5,0.5)这基本上是因为问题要求整数.对于1,它是(0.5,1.5). (2认同)
  • 它可以在这些参数下正常工作,但如果标准偏差较小,则最终pdf大于1.只要你之后进行相同的归一化(除以总和)就可以了,但我不想混淆潜在的读者,因为pdf实际上不是概率(这就是为什么它可能大于1)所以我想用实际概率. (2认同)

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)

在此输入图像描述

  • @RobertLugg 相对较高的对称性可能是由于样本量较大。也就是说,我认为这个答案中的代码更简单。 (2认同)
  • 请注意,您使用此代码覆盖了 python range 函数。尝试使用中性变量名称。 (2认同)

ste*_*han 5

此处接受的答案有效,但我尝试了 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)

看起来不错吧?

  • 不是生成“randomNums”并将它们四舍五入为“整数”(实际上是以“.0”结尾的实数),而是“randomInts = np.random.normal(loc=10,scale=3,size=10000).astype” (int)-10`,它返回实际的整数?但是,请注意,必须生成除 0 之外的 loc 值(并通过减去 loc 将其返回到 0),否则最终会得到_太多_结果正好是“0”。 (4认同)