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

由于数字的大小,它会出错:
OverflowError:long int太大,无法转换为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

最佳答案

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

您提供的链接建议了另一种方法(引用后的公式),如果您按正确的顺序进行计算,则应避免使用大量方法。但是舍入误差的累积可能会影响结果。在代码中

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


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

10-06 12:37