您可以使用大n 的二项式的正态近似来计算此比率。当n 很大时,k 必须相对接近n/2 才能使(n choose k) / 2^n 不可忽略。
代码
这里有一些代码可以计算这个:
def n_choose_k_over_2_pow_n(n, k):
# compute the mean and standard deviation of the normal
# approximation
mu = n / 2.
sigma = np.sqrt(n) * 1/4.
# now transform to a standard normal variable
z = (k - mu) / sigma
return 1/np.sqrt(2*np.pi) * np.exp(-1/2. * z**2)
这样:
>>> n_choose_k_over_2_pow_n(3e28, 2e28)
0.0
>>> n_choose_k_over_2_pow_n(3e28, 1.5e28)
0.3989422804014327
如您所见,计算下溢。一个解决方案是计算答案的log,我们可以用这段代码来做:
def log_n_choose_k_over_2_pow_n(n, k):
# compute the mean and standard deviation of the normal
# approximation
mu = n / 2.
sigma = np.sqrt(n) * 1/4.
# now transform to a standard normal variable
z = (k - mu) / sigma
# return the log of the answer
return -1./2 * (np.log(2 * np.pi) + z**2)
另一个快速检查:
>>> log_n_choose_k_over_2_pow_n(3e28, 2e28)
-6.6666666666666638e+27
>>> log_n_choose_k_over_2_pow_n(3e28, 1.5e28)
-0.91893853320467267
如果我们对这些取幂,我们将得到之前的答案。
说明
我们可以通过求助于统计结果来做到这一点。二项分布由下式给出:
P(K = k) = (n choose k) p^k * p^(n-k)
对于大的n,这很好地近似于正态分布,均值n*p,方差n*p*(1-p)。
将p 设置为1/2。然后我们有:
P(K = k) = (n choose k) (1/2)^k * (1/2)^(n-k)
= (n choose k) (1/2)^n
= (n choose k) / (2^n)
这正是你的比率的形式。因此,在转换为均值 n/2 和方差 n/4 的标准正态变量后,我们可以通过对标准正态分布 pdf 的简单评估来计算您的比率。