Вы вычисляете PDF обобщенной проблемы дня рождения. Это в основном все здесь, в https://en.wikipedia.org/wiki/Birthday_problem. Единственная проблема - страница вики говорит о CDF проблемы (см. Первый график здесь), вы выбираете PDF, значения p (n, k) - p (n, K-1). Вот ваш график выборки (синий) против PDF (оранжевый), если вам нужен код, просто скажите мне

UPDATE
В любом случае, лучше поместите код здесь, чтобы он не терялся. Все факториалы вычисляются как гамма-функции, а выражение для pbar / p выполняется через логарифмы, избегая переполнений, поэтому существуют вызовы логарифма функции Gamma, lgamma.
import matplotlib.pyplot as plt
import numpy as np
import math
import random
def pbar(k, n): # as in wiki article, computed via log/exp
l = 0
try:
l = math.lgamma(n + 1) - math.lgamma(n - k + 1) - k*math.log(n)
except ValueError:
l = -50
return math.exp(l)
def p(k, n):
return 1.0 - pbar(k, n)
def count_no_repeat(i, j): # original sampling code
random_set = set()
while True:
new_number = random.randint(i,j)
if new_number in random_set:
break
random_set.add(new_number)
return len(random_set) + 1
# 100 of numbers, 1mln of samples
n = 100
N = 1000000
stats = np.zeros(n+2, dtype = np.float32)
meds = []
for _ in range(0, N):
q = count_no_repeat(1, n)
stats[q] += 1
meds.append(q)
print(np.median(meds))
stats /= float(N)
x = np.linspace(0, n+1, n+2)
# computing PDF
z = []
for k in x:
if k == 0:
z.append(0)
else:
z.append(p(k, n) - p(k-1, n))
plt.plot(x, stats, 'o')
plt.plot(x, z)
plt.show()