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


я играл со случайной библиотекой в 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,... но я не могу этого объяснить.

Edit: вопрос не был похож на предложенный как дубликат, так как проблема в моем случае была библиотекой seaborn и тем, как я визуализировал данные.

Edit 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) 

2 59

2 ответа:

проблема, кажется, в вашем grapher,seaborn, не randint().

есть 50 баков seaborn схема распределения, согласно моему подсчету. Кажется, что seaborn на самом деле биннинг ваш вернулся randint() значения в этих ячейках, и нет никакого способа получить равномерное распределение 110 значений в 50 ячеек. Поэтому вы получаете те пики, где три значения помещаются в ячейку, а не обычные два значения для других ячеек. Значения пиков подтверждают это: они на 50% выше, чем в других барах, как и ожидалось для 3 значения, объединенные в бины, а не за 2.

другой способ для вас, чтобы проверить это, чтобы заставить seaborn использовать 55 ячеек для этих 110 значений (или, возможно, 10 ячеек или какой-либо другой делитель 110). Если вы все еще получаете пики, то вы должны беспокоиться о 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-консоль, восстановил наблюдения и использовал R hist() в результате получения этой гистограммы (с наложенной кривой плотности):

enter image description here

как вы можете видеть, это подтверждает, что проблема, которую вы наблюдали, не прослеживается до randint но это артефакт sns.displot().