兰丁特并不总是遵循统一分配

时间:2016-12-12 11:53:17

标签: python random

我正在使用Python中的随机库来模拟我工作的项目,我发现自己处于一个非常奇怪的位置。

我们假设我们在Python中有以下代码:

from random import randint
import seaborn as sns

a = []
for i in range(1000000):
    a.append(randint(1,150))

sns.distplot(a)

该图遵循“离散均匀”分布。

Range betwee 1 and 150

然而,当我将范围从1更改为110时,图表有几个峰值。

from random import randint
import seaborn as sns

a = []
for i in range(1000000):
    a.append(randint(1,110))

sns.distplot(a)

Range from 1 to 110

我的印象是峰值在0,10,20,30,...但我无法解释。

编辑:问题与提议的问题并不相似,因为我的案例中的问题是seaborn库以及我可视化数据的方式。

编辑2:根据对答案的建议,我尝试通过更改seaborn库来验证它。相反,使用matplotlib两个图都是相同的

from random import randint
import matplotlib.pyplot as plt

a = []
for i in range(1000000):
    a.append(randint(1,110))

plt.hist(a) 

From matplotlib

2 个答案:

答案 0 :(得分:122)

问题似乎出现在你的牧羊人seaborn,而不是randint()

根据我的统计数据,您的seaborn分布图中有50个分档。似乎seaborn实际上是在这些箱子中归类你返回的randint()值,并且没有办法将110个值均匀分布到50个箱子中。因此,您可以获得三个值放入bin中的峰值,而不是其他二进制值的通常两个值。您的峰值确认了这一点:它们比其他条形图高50%,正如预期的3个分档值而不是2个。

另一种检查方法是强制seaborn为这110个值使用55个二进制位(或者可能是10个二进制位或110个其他除数)。如果你仍然得到了峰值,那么你应该担心randint()

答案 1 :(得分:21)

为了添加@RoryDaulton的优秀答案,我运行randint(1:110),生成频率计数并将其转换为R计算器,如下所示:

hits = {i:0 for i in range(1,111)}
for i in range(1000000): hits[randint(1,110)] += 1
hits = [hits[i] for i in range(1,111)]
s = 'c('+','.join(str(x) for x in hits)+')'
print(s)

c(9123,9067,9124,8898,9193,9077,9155,9042,9112,9015,8949,9139,9064,9152,8848,9167,9077,9122,9025,9159,9109,9015,9265,9026,9115,9169,9110,9364,9042,9238,9079,9032,9134,9186,9085,9196,9217,9195,9027,9003,9190,9159,9006,9069,9222,9205,8952,9106,9041,9019,8999,9085,9054,9119,9114,9085,9123,8951,9023,9292,8900,9064,9046,9054,9034,9088,9002,8780,9098,9157,9130,9084,9097,8990,9194,9019,9046,9087,9100,9017,9203,9182,9165,9113,9041,9138,9162,9024,9133,9159,9197,9168,9105,9146,8991,9045,9155,8986,9091,9000,9077,9117,9134,9143,9067,9168,9047,9166,9017,8944)

然后我将其粘贴到R控制台,重建观察结果并在结果上使用R hist(),获得此直方图(具有叠加的密度曲线):

enter image description here

如您所见,这证实您观察到的问题无法追溯到randint,但却是sns.displot()的工件。