兰德林并不总是遵循统一的分配
我正在玩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,…但我无法解释它。
编辑:这个问题是不相似的build议重复,因为在我的情况下,问题是seaborn图书馆和我的方式可视化的数据。
编辑2:按照答案的build议,我试图通过更改seaborn库来validation它。 相反,使用matplotlib这两个图都是一样的
from random import randint import matplotlib.pyplot as plt a = [] for i in range(1000000): a.append(randint(1,110)) plt.hist(a)
这个问题似乎是在你的seaborn
,而不是在randint()
。
根据我的统计,你的seaborn
分布图中有50个垃圾箱。 看来seaborn实际上是将你的返回的randint()
值分箱到这些bin中,并且没有办法将110个值的均匀散布到50个bin中。 因此,你可以得到三个值放入一个bin的峰值,而不是其他bin的通常的两个值。 你的高峰值证实了这一点:他们是比其他酒吧高出50%,如预期的3个binned值而不是2。
另一种检查方法是强制seaborn
使用这些110个值(或者10个箱子或者110个其他除数)的55个箱子。 如果你仍然得到高峰,那么你应该担心randint()
。
为了增加@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-控制台上,重新构build观察结果,并用R的hist()
得到这个直方图(叠encryption度曲线):
正如你所看到的,这证实了你观察到的问题不能追踪到randint
而是sns.displot()
一个神器。