尤拉計劃547:帶洞正方形內任意點間距離

lt發表於2020-01-04

譯文來自 http://pe-cn.github.io/547/

在長方形中(均勻地)隨機選擇兩個點,可以算出兩點間距離的期望值。

例如,在單位正方形中任意兩點間距離的期望約為0.521405,而在寬為2長為3的長方形中任意兩點間距離的期望約為1.317067。

從邊長為整數n ≥ 3、含有n2個單位正方形的大正方形中,去掉一個由x × y個單位正方形組成的長方形(1 ≤ x,y ≤ n - 2),我們稱剩下的圖形為邊長為n的帶洞正方形。

當n = 3時,只有一種帶洞正方形:

p547-holes-1.png

當n = 4時,不考慮旋轉和翻轉,你能找出9種不同的帶洞正方形:

p547-holes-2.png

記S(n)是所有可能的邊長為n的帶洞正方形中任意兩點間距離的期望之和。這裡的任意兩點必須在大正方形去除內部長方形後剩下的區域,也即上圖中的灰色區域。

例如,S(3) = 1.6514而S(4) = 19.6564,均保留小數點後4位小數。

求S(40)並保留小數點後4位小數。

先用小格子模擬一下:

from math import sqrt 
def e547(n): #n<=30
 dist=0.0
 for i in range(n):
  for j in range(n):
   for i1 in range(n):
    for j1 in range(n):
     dist+=sqrt((j-j1)**2+(i-i1)**2)
 return dist/(n**5) #n**4條線,n是邊長的比例尺

執行結果為

>>> print(e547(10))
0.5186872221213251 
>>> print(e547(20))
0.520756536423531  
>>> print(e547(30))
0.5211214715615858 

再來帶洞的邊長為3的。

def e547(n,m): #n<=30
 dist=0.0
 ct=0
 for i in range(n*m):
  for j in range(n*m):
   for i1 in range(n*m):
    for j1 in range(n*m):
     #if (not (i in range(n,n*2) and j in range(n,n*2))and not (i1 in range(n,n*2) and j1 in range(n,n*2)) ):
     if (not (i >=n and i<n*2 and j >=n and j<n*2)and not (i1 >=n and i1<n*2 and j1 >=n and j1<n*2) ):
      ct+=1
      dist+=sqrt((j-j1)**2+(i-i1)**2)
 return dist/(ct*n)

>>> print(e547(10,3))
1.6505096708301576
>>> print(e547(20,3))
1.651145010385864 

相關文章