在python中模拟binominal coefficent(nCr)

问题描述:

出于好奇,我想知道是否有办法通过python中的模拟解决二项系数。我尝试了一下,但这些数字变得如此之快,以至于我无法解决这个问题,只能得到很少的数字。在python中模拟binominal coefficent(nCr)

我知道这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)) 

有没有可能为大数字高效,快速做到这一点?

+2

的可能的复制[统计:在Python的组合(https://stackoverflow.com/questions/3025162/statistics-combinations-in-蟒蛇) – Gahan

+0

我没有得到你的代码:8行建成“ü”,这是不使用... 加:函数梳定义在你的代码是在我的电脑上快速,可以处理相当大的数字,即使这是一个相当模糊的定义... – Setop

我用这个,它非常高效地为大量:

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 
+0

这是神奇的,不是蛮力;-) – landge

+0

它可能是神奇的,但使用timeit,它显示比使用'fac'慢两到三倍 – Setop

+0

不适用于大数字它不是。 尝试: 'NCK(10 ** 6,50 * 10 ** 3)' VS '梳(10 ** 6,50 * 10 ** 3)' (我的电脑上4S VS 46S) –