Рэндинт не всегда следует равномерному распределению

Я играл со случайной библиотекой в ​​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().