1

我是一个新手,我正在尝试在 python 中编写以下阶乘序列,以计算有限范围内的序列中的第一个匹配数。kd×d×(d−1)×⋯×(d−k+1)d×d×⋯d=k(d−1)!dk(d−k)!所以匹配所需数字的期望值为 ∑k=1d(k+1)k(d−1)!dk(d−k)!。

由于数字的大小,它会出错:OverflowError: long int too large to convert to float 所以我正在使用日志,但仍然出现错误。想知道是否有人对此有好主意。

 m = 365
  q = 1
  a=[]
  for x in range(q,m):
    #y = y + x*(1/365)
    #####y = y + (factorial(x)/(factorial(m-x)*(exponent(m,x))))
    a.append((log((factorial(m))/exponent(m,x)))*log((q+x)/m))
    #y = [(m-x)*factorial(m-x)/m]
    #print ("x: ",x,"   y: ",y)
  #return "a:",a,"  product-sum:",[a*a for a in a]
  return sum(a)

对不起,我看到上面的等式不清楚。这是我想要了解的内容: http ://en.wikipedia.org/wiki/Birthday_problem#Average_number_of_people

4

1 回答 1

2

编辑:刚刚意识到 - 我认为日志首先不会对您有太大帮助:您正在尝试计算总和,而日志对总和不是很友好(它们对产品有好处)。

您提供的链接建议了另一种方法(公式紧跟在您引用的那个之后),如果您以正确的顺序计算,应该避免大量数字。但舍入误差的累积可能会影响结果。在代码中

m = 365 
ans = 0
for x in range(0,m-1):
  tmp = 1
  for y in range(0,x):
    tmp *= (M-y)/M
  ans += tmp
return ans

也就是说,使用给定的渐近公式可能是一种更好的计算方法。

于 2012-10-13T04:57:05.460 回答