对于大的n,您可以用二项式的法向近似来计算这个比率。当n较大时,k必须相对接近n/2,这样{}才不可忽略。在
代码
下面是一些可以计算的代码: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)
因此:
^{pr2}$
正如你所看到的,计算是下溢的。一个解决方案是计算答案的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,这是很好的近似正态分布的平均值{}和方差{}。在
将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的简单评估来计算您的比率。在