Numpy:数组中元素总和大于或等于10的概率是多少?

时间:2017-04-28 04:04:39

标签: python algorithm numpy math probability

我正在尝试编写一个程序来计算N array elements之和大于或等于M number的概率。在N数组中,数组的第一个元素是N,而其他元素是N-1(可以重复)。

例如:我的数组大小为N=5M=10,第一个元素总是5,而其他元素从1到4.所以它看起来像在下面的迭代中。由于除了第一个,其他元素随机生成,我需要找到Sum>=10 or not

的概率
    Random_Iteration1: Arr=[5, 3, 2, 1, 3] Sum = 13
    Random_Iteration2: Arr=[5, 1, 1, 1, 1] Sum = 9
    Random_Iteration3: Arr=[5, 1, 2, 2, 1] Sum = 11

我在Python中编写了以下代码:

    import numpy as np
    N=5 #array size
    M=10 
    arr = []
    arr.append([N])
    arr.append(np.random.choice(np.arange(1, N), size=N-1).tolist()) 
    arr = sum(arr,[]) #generates array such that 1st element is N, rest are randomly generated elements from 1 to N-1
    arr_sum = np.sum(arr) #gives array sum

    possibilities = N*N
    #numerator = I am not sure what to take here

我真的很感激任何帮助。如果需要解释任何细节,请告诉我。 谢谢。

1 个答案:

答案 0 :(得分:1)

您可以在O(n(m + n))时间内精确计算。该问题等同于找到n-1个骰子的概率,每个骰子具有n-1个边并且至少为m-n。 n k侧骰子的概率分布由多项式的系数给出(1 + x + x ^ 2 + ... + x ^ k)^ n / k ^ n。

此代码迭代计算该多项式,丢弃与x的幂相对应的m或更大的项。

迭代完成后,数组中的概率对应于骰子和为0,1,2,...,m-1的概率,其和为1减去骰子和的概率至少m。

函数prob_weird_sum是计算给定问题的结果的代码。

from fractions import Fraction as F

# Returns the probability that the sum of
# n IID uniform random variables that take
# values 1..k is greater than or equal to m.
def prob_sum_ge(n, k, m):
    if m <= 0: return 1
    p = [F(1)] + [0] * (m - 1)
    for _ in xrange(n):
        S = 0
        for i in xrange(m-1, -k-1, -1):
            if i >= 0:
                S += p[i]
            if i + k < m:
                S -= p[i+k]
                p[i+k] = S / k
    return 1 - sum(p)

# The probability that if you add n, and n-1
# uniform IID random numbers 1..n-1, you get
# at least m.
def prob_weird_sum(n, m):
    return prob_sum_ge(n-1, n-1, m-n)

print prob_weird_sum(3, 2)

该计划的输出是:

255/256