我正在使用Python中的随机库来模拟我工作的项目,我发现自己处于一个非常奇怪的位置。
我们假设我们在Python中有以下代码:
from random import randint
import seaborn as sns
a = []
for i in range(1000000):
a.append(randint(1,150))
sns.distplot(a)
该图遵循“离散均匀”分布。
然而,当我将范围从1更改为110时,图表有几个峰值。
from random import randint
import seaborn as sns
a = []
for i in range(1000000):
a.append(randint(1,110))
sns.distplot(a)
我的印象是峰值在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)
答案 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()
,获得此直方图(具有叠加的密度曲线):
如您所见,这证实您观察到的问题无法追溯到randint
,但却是sns.displot()
的工件。