python阶乘序列匹配rang中的第一对

2024-04-24 11:49:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个新手,我正在尝试用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)!。你知道吗

由于数字的大小,它会出错: 溢出错误: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


Tags: inlogforreturn错误序列数字long
1条回答
网友
1楼 · 发布于 2024-04-24 11:49:19

编辑:刚刚意识到-我不认为日志会帮助你在这里放在第一位:你正在试图计算一个总和,日志不是很友好的总和(他们是好的产品)。你知道吗

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

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

也就是说,使用一个类似于给定的渐近公式可能是一个更好的计算方法。你知道吗

相关问题 更多 >