2017-12-18 113 views
1

出於好奇,我想知道是否有辦法通過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

回答

0

我用這個,它非常高效地爲大量:

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) –