在python中模拟二项式系数(nCr)
Posted
技术标签:
【中文标题】在python中模拟二项式系数(nCr)【英文标题】:simulate binominal coefficent (nCr) in python 【发布时间】:2018-05-31 16:13:57 【问题描述】:出于好奇,我想知道是否有办法通过在 python 中模拟来解决二项式系数。我尝试了一点,但数字变得如此之快,以至于我无法解决任何问题,只能解决非常小的数字。
我知道question,但无法确定一种仅使用蛮力求解系数的解决方案。但我必须承认,我并不了解其中列出的所有实现。
这是我幼稚的做法:
import random
import numpy as np
from math import factorial as fac
# Calculating the reference with help of factorials
def comb(n,k):
return fac(n) // fac(k) // fac(n-k)
# trying a simple simulation with help of random.sample
random.seed(42)
n,k = 30,3
n_sim = 100000
samples = np.empty([n_sim,k], dtype=int)
for i in range(n_sim):
x = random.sample(range(n),k)
samples[i] = sorted(x)
u = np.unique(samples, axis=0)
print(len(u))
print(comb(n,k))
是否有可能高效、快速地处理大量数据?
【问题讨论】:
Statistics: combinations in Python的可能重复 我没有得到你的代码:8行来构建“u”,它没有被使用......另外:你的代码中定义的函数comb在我的计算机上很快并且可以处理很大数字,即使它是一个相当模糊的定义...... 【参考方案1】:我用这个,它对大数字非常有效:
def nck(n, k):
if k < 0 or k > n:
return 0
if k == 0 or k == n:
return 1
k = min(k, n - k) # take advantage of symmetry
c = 1
for i in range(k):
c = c * (n - i) // (i + 1)
return c
【讨论】:
这可能很神奇,但使用 timeit 显示比使用fac
慢两到三倍
不适合大数字。试试:nck(10**6,50*10**3)
vs comb(10**6,50*10**3)
(我的电脑上是 4s vs 46s)以上是关于在python中模拟二项式系数(nCr)的主要内容,如果未能解决你的问题,请参考以下文章