Рэндинт не всегда следует равномерному распределению
Я играл со случайной библиотекой в 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 и 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)
![Диапазон от 1 до 110]()
Мое впечатление, что пики на 0,10,20,30,... но я не могу это объяснить.
Изменить: Вопрос не был похож на предлагаемый как дубликат, так как проблема в моем случае была в библиотеке морского судна и в том, как я визуализировал данные.
Изменить 2: Следуя рекомендациям по ответам, я попытался проверить это, изменив библиотеку морского дна. Вместо этого, используя matplotlib, оба графика были одинаковыми
from random import randint
import matplotlib.pyplot as plt
a = []
for i in range(1000000):
a.append(randint(1,110))
plt.hist(a)
![От matplotlib]()
Ответы
Ответ 1
Проблема, кажется, в вашем grapher, seaborn
, а не в randint()
.
В вашей диаграмме распределения seaborn
имеется 50 ящиков, согласно моему счету. Кажется, что морское судно фактически бинирует ваши возвращенные значения randint()
в этих ячейках, и нет возможности получить равномерное распространение 110 значений в 50 бункеров. Поэтому вы получаете те пики, где три значения помещаются в корзину, а не обычные два значения для других бункеров. Значения ваших пиков подтверждают это: они на 50% выше, чем другие бары, как и ожидалось для трех значений binned, а не для 2.
Еще один способ проверить это - заставить seaborn
использовать 55 бункеров для этих 110 значений (или, возможно, 10 бункеров или другой делитель из 110). Если вы все еще получаете пики, вам следует беспокоиться о randint()
.
Ответ 2
Чтобы добавить к @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()
.