Python程序說明貝特朗悖論不是悖論
雖然三種方法得到的弦都能“覆蓋”整個圓,但弦長的分布不同,見上圖。
from math import pi import numpy as np from PIL import Image as Img, ImageDraw as ID import matplotlib.pyplot as plt R = 64 # 圓的半徑r為1,放大為R W = H = 2 * R + 16 # 圖片比圓大一圈以免有些線畫不全 N = 1_00_00 # 這么多次 # 圓心為原點,左上(-1, -1),右下(1, 1) # 輸入為原始坐標, N * [x0, y0, x1, y1] # 畫圖時左上(0, 0),右下(W, H) def line (draw, a) : a = R - a * R + 8 # a = W - (a + 1) * R - 8 for i in range(N): draw.line( ((a[i,0],a[i,1]), (a[i,2],a[i,3])), fill=255 ) def do_it (i) : img = Img.new('L', (W, H)) # 單色'1'比灰度'L'慢 draw = ID.Draw(img) # AI說連續多次rand是均勻分布 y = np.random.uniform(low=-1.0, high=1.0, size=N) x = np.sqrt(1 - y ** 2) if i == 0: a = np.column_stack((-x, y, x, y)) else: # signs別用兩次! x *= np.random.choice([-1, 1], size=N) if i == 1: # (x,y)到(0,-1) a = np.column_stack((np.full_like(x, 0), np.full_like(y, -1), x, y)) else: y2 = np.random.uniform(low=-1.0, high=1.0, size=N) x2 = np.sqrt(1 - y2 ** 2) * np.random.choice([-1, 1], size=N) a = np.column_stack((x2, y2, x, y)) line(draw, a); img.save(f'/t/{i}.png') # hypotenuse: 斜邊 a = np.hypot(a[:,2] - a[:,0], a[:,3] - a[:,1]) prob = np.sum(a > 3 ** 0.5) / N # 概率 # 弦覆蓋圓嗎? print(prob, (img.histogram()[255] / R ** 2) / pi) return a, str(prob) for i in range(3): a,p = do_it(i); plt.hist(a, bins=50, alpha=0.5, label=p) plt.xlabel('Chord Length', fontsize=12) plt.ylabel('Frequency', fontsize=12) plt.xticks(rotation=45, fontsize=9) plt.grid(axis='y', alpha=0.5) # 顯示網格 plt.tight_layout() plt.legend() plt.show()
“覆蓋圖”:



參考資料,中文搜“貝特朗悖論”即可,英文可Bing(PDF Bertrand paradox (probability) - Universitetet i Oslo).

浙公網安備 33010602011771號