我面对这个奇怪的问题。也许有人可以引导我参考相关文献。
所以,在Python中,我创建了这个方法,它附加随机整数来设置,直到出现重复值。当生成的整数不是特别设置的唯一时,方法制动器:
import random
def count_no_repeat(i,j):
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
然后,我重复了这种方法一千次来计算:生成非前置值需要多少步骤
stats = []
for _ in range(1000):
stats.append(count_no_repeat(1,n))
n - 整数生成器有上限。
所以,对于这个实验中位数:
谁可以提供帮助,并说,为什么会这样? 谢谢!
答案 0 :(得分:0)
您正在计算广义生日问题的PDF。它基本上都在https://en.wikipedia.org/wiki/Birthday_problem。唯一的问题是Wiki页面正在讨论问题的CDF(参见这里的第一张图),你正在采样PDF,p(n,k) - p(n,k-1)的值。这是您的采样(蓝色)与PDF(橙色)的情节,如果您需要代码告诉我
更新
无论如何,最好把代码放在这里,这样就不会丢失。所有阶乘都计算为Gamma函数,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()