我正在尝试编写一个程序来计算N array elements
之和大于或等于M number
的概率。在N
数组中,数组的第一个元素是N
,而其他元素是N-1
(可以重复)。
例如:我的数组大小为N=5
和M=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
我真的很感激任何帮助。如果需要解释任何细节,请告诉我。 谢谢。
答案 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