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 ответа:
проблема, кажется, в вашем 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()
в результате получения этой гистограммы (с наложенной кривой плотности):как вы можете видеть, это подтверждает, что проблема, которую вы наблюдали, не прослеживается до
randint
но это артефактsns.displot()
.