隨機從1x1大小的正方形平面上取3個點,構成銳角三角形的概率是多少?

如題。。請問這種隨機三角形,構成銳角三角形容易還是鈍角三角形容易???如果算概率的話


謝邀 @Wane Matt
這個問題在A Problem in Geometry Probability一文中已經得到了解決,雖然給題主的問題比好像有一丟丟不一樣。我在這裡搬運主要過程,中間的一些細節大家可以去看原文

paper中的問題是:假設有一個邊長分別為1和L的長方形left{ left( x,y 
ight):0leq xleq1, 0leq yleq L 
ight} ,隨機選三個點P_1=left( X_1, Y_1
ight)P_2=left( X_2, Y_2
ight)P_3=left( X_3, Y_3
ight),那麼三角形P_1P_2P_3是鈍角三角形的概率是多少?其中,找點的具體方法是設定X_1X_2X_3left[0,1 
ight]內均勻分布的隨機變數,Y_1Y_2Y_3[0, L]內均勻分布的隨機變數

首先簡化問題。三角形是鈍角三角形的概率是L的函數,記為P(L),根據對稱性,P(L)是三角形中任何一個角是鈍角的概率的3倍。取P_1為例,那麼有cos P_1=frac{left(P_1P_2
ight)cdot left(P_1P_3
ight)}{|P_1P_2||P_2P_3|},其中
left(P_1P_2
ight)cdot left(P_1P_3
ight)=left(X_2-X_1
ight)left(X_3-X_1
ight)+(Y_2-Y_1)(Y_3-Y_1)

定義X=left(X_2-X_1
ight)left(X_3-X_1
ight)Y=(Y_2-Y_1)(Y_3-Y_1)P_1是鈍角等價於X+Y<0,所以P(L)=3Pr{X+Y<0}。假設X的累積分布函數是F(x),則Y的累積分布函數就是Fleft(frac{y}{L^2}
ight),則有
Pr{X+Y<0}=int_{-infty}^{infty} Fleft(-frac{x}{L^2}
ight)dF(x),即P(L)=3int_{-infty}^{infty} Fleft(-frac{x}{L^2}
ight)dF(x)

所以需要解決F(x)的問題。假定條件累積分布函數F_1left(x, a
ight)=Pr{Xleq x|X_1=a}=Pr{(X_2-a)(X_3-a)leq x},則有F(x)=int_{0}^{1} F_1(x, a)da

(X_2-a)(X_3-a)= x是一條雙曲線。當x>0時,(X_2-a)(X_3-a)leq x是下圖中的陰影部分

需要注意的是這個圖有誤導性,左上角和右下角的兩塊白色區域可能不存在。在a^2> x時左下角存在,面積為
A_1(x, a)=int_{0}^{a-x/a} left(a+frac{x}{X_3-a}
ight)dX_3=xlog x-2xlog a+a^2-x

同理,(1-a)^2geq x時右上角存在,面積為
A_2(x, a)=int_{a+x/(1-a)}^{1} left(1-a-frac{x}{X_3-a}
ight)dX_3
=xlog x-2xlog (1-a)+(1-a)^2-x

F_1(x,a)=1-A_1(x,a)-A_2(x,a)

由於a的取值範圍是[0,1],故xgeq 1a^2leq x,兩塊白色區域不存在,F(x)=1

0<x<1時,考慮兩塊區域出現的條件,得
F(x)=int_{0}^{1}F_1(x,a)da= 1-int_{sqrt{x}}^{1}A_1(x,a)da-int_{0}^{1-sqrt{x}}A_2(x,a)da
=-2x(log x +1)+frac{1}{3}left(1+8x^{3/2}
ight)

x<0時,(X_2-a)(X_3-a)leq x是下圖中的陰影部分

這兩塊陰影面積同樣也可能不存在,但跟前一次的不同,前一次的兩塊可能不是同時存在,這一次的兩塊是同時的,要麼一起有要麼一起沒,存在的條件是x>a(a-1),而且兩塊面積相等,分別是
A_3(x,a)=A_4(x,a)=int_{a-x/a}^{1}left(a+frac{x}{X_3-a}
ight)dX_3
=-xlog (-x)+xlog(a(1-a))+a(1-a)+x

F_1(x,a)=A_3(x,a)+A_4(x,a)

由於a的取值範圍是[0,1],故xleq -1/4xleq a(a-1),兩塊陰影區域不存在,F(x)=0

-1/4<x<0時,考慮兩塊區域出現的條件,得
F(x)=int_{0}^{1} F_1(x,a)da=int_{frac{1-sqrt{1+4x}}{2}}^{frac{1+sqrt{1+4x}}{2}}F_1(x,a)da
=2xlogleft(frac{1+sqrt{1+4x}}{1-sqrt{1+4x}}
ight)+frac{1}{3}(1-8x)sqrt{1+4x}

還剩x=0,取個極限可得F(0)=1/3

綜上可得(換行大括弧不會打)

於是我們就可以開始算了。看上面的函數形式,F(x)的導數即概率密度函數存在,所以
P(L)=int_{-infty}^{infty} Fleft(-frac{x}{L^2}
ight)F

根據對稱性,P(L)=P(1/L),所以考慮Lgeq 1就行了。在x<-1/4F,積分下限為-1/4。若Lgeq 2x>1F;若1leq L leq 2x>L^2/4F(-x/L^2)=0。定義alpha=min(1,L^2/4),則
P(L)=3int_{-1/4}^{alpha} F(-x/L^2)F

經過好大一坨計算,可得(太尼瑪長了哥實在是打不動了)
1leq Lleq 2

Lgeq 2

圖長這樣

也就是說如果Lgeq0隨便取,那應該是正好在正方形L=1P(L)達到最低點97/150+pi/40,大約為0.725。而三角形是直角三角形以及正好排在一條直線上的概率顯然都是0,故是銳角三角形的概率大約是0.275,跟其他同學的模擬吻合。最後,L>1時就相當於把L=1的情況給「壓扁」了一點,從直觀上看,正方形中找到的鈍角三角形被壓了之後還是鈍角三角形,然而有些銳角三角形就變成了鈍角三角形,壓得越「厲害」就越多,所以相應的,P(L)Lgeq 1時會隨著L變大而變大


points = RandomReal[1, {10^6, 3, 2}];
vector := ({#[[1]] - #[[2]], #[[2]] - #[[3]], #[[3]] - #[[1]]} );
judge := (Times[#[[2]].#[[1]], #[[3]].#[[2]], #[[1]].#[[3]]] );
Count[UnitStep[judge /@ (vector /@ points)], 0]/10^6 // N
結果0.27489
==============================================

固定點就不一樣了。


# -*- coding: utf-8 -*-
import numpy as np

#產生一萬個樣本,每個樣本三個點,每個點有兩個坐標值
p = np.random.uniform(0,1,[1000000,6])

#對每個樣本得到三個向量標識三個邊
v = [p[:,0]-p[:,2] , p[:,1]-p[:,3],
p[:,2]-p[:,4] , p[:,3]-p[:,5],
p[:,4]-p[:,0] , p[:,5]-p[:,1]]

#三個向量兩兩內積
i = [v[0]*v[2]+v[1]*v[3] ,
v[2]*v[4]+v[3]*v[5] ,
v[4]*v[0]+v[5]*v[1] ]
i = [ii.tolist() for ii in i]
i = map(list, zip(*i))

#內積小於0為銳角,三個角皆為銳角則銳角三角形
j = [ii[0]&<0 and ii[1]&<0 and ii[2]&<0 for ii in i] print float(sum(j))/len(j)

結果大概是0.275


約為:27.4789%

inline bool IsAcuteTriangle(float x0, float y0, float x1, float y1, float x2, float y2)
{
float x_dis_10 = x1 - x0;
float y_dis_10 = y1 - y0;
float x_dis_20 = x2 - x0;
float y_dis_20 = y2 - y0;
float x_dis_21 = x2 - x1;
float y_dis_21 = y2 - y1;
float sq_dis_10 = x_dis_10*x_dis_10 + y_dis_10*y_dis_10;
float sq_dis_20 = x_dis_20*x_dis_20 + y_dis_20*y_dis_20;
float sq_dis_21 = x_dis_21*x_dis_21 + y_dis_21*y_dis_21;

return (sq_dis_10 + sq_dis_20 &> sq_dis_21)
(sq_dis_10 + sq_dis_21 &> sq_dis_20)
(sq_dis_20 + sq_dis_21 &> sq_dis_10);
}

inline float rand_real(float a)
{
return a * (float)(::rand() / ((float)RAND_MAX + 1));
}

void main()
{
const unsigned int count = 1000000000;
unsigned int numAcuteTriangles = 0;

float x0;
float y0;
float x1;
float y1;
float x2;
float y2;

for (unsigned int i = 0; i &< count; i++) { x0 = rand_real(1.0f); y0 = rand_real(1.0f); x1 = rand_real(1.0f); y1 = rand_real(1.0f); x2 = rand_real(1.0f); y2 = rand_real(1.0f); if (IsAcuteTriangle(x0, y0, x1, y1, x2, y2)) { ++numAcuteTriangles; } } printf("%d, %f", numAcuteTriangles, numAcuteTriangles*100.0f/count); Sleep(100); }


用R,將三個點的坐標精確到小數點後10位,通過100000次模擬,形成銳角三角形的概率大概為0.2376;形成鈍角三角形的概率大概為0.7241。
f=function(n){
m=10
z=99
x=round(runif(6,0,1),m)
a1=(x[1]-x[3])*(x[1]-x[3])+(x[2]-x[4])*(x[2]-x[4])
a2=(x[1]-x[5])*(x[1]-x[5])+(x[2]-x[6])*(x[2]-x[6])
a3=(x[5]-x[3])*(x[5]-x[3])+(x[6]-x[4])*(x[6]-x[4])
y=sort(c(a1,a2,a3))
if(y[1]+y[2]&>y[3]){
z=0
}
else{
z=2
}
z
}
mm=100000
x=sapply(c(1:mm), f)
length(x[x==0])/mm


把問題拓展到1*1*1的正方體中,形成銳角三角形的概率大概為0.45984;形成鈍角三角形的概率大概為0.54366。
f=function(n){
m=10
z=99
x=round(runif(9,0,1),m)
a1=(x[1]-x[4])*(x[1]-x[4])+(x[2]-x[5])*(x[2]-x[5])+(x[3]-x[6])*(x[3]-x[6])
a2=(x[1]-x[7])*(x[1]-x[7])+(x[2]-x[8])*(x[2]-x[8])+(x[3]-x[9])*(x[3]-x[9])
a3=(x[4]-x[7])*(x[4]-x[7])+(x[5]-x[8])*(x[5]-x[8])+(x[6]-x[9])*(x[6]-x[9])
y=sort(c(a1,a2,a3))
if(y[1]+y[2]& z=0
}
else{
z=2
}
z
}
mm=100000
x=sapply(c(1:mm), f)
length(x[x==0])/mm


知乎首答。
看了前面兄弟的python代碼,發現實現之後得到的概率是0.382.............
仔細看了一下,其實只有一點小瑕疵。就是........均勻分布的上限應該是根號二。

import numpy as np
import numba as nb

def sim(k=100000):
sum=0
for i in range(k):
x_rand=np.random.uniform(0.0, np.sqrt(2), (3,))
y_rand=np.random.uniform(0.0, np.sqrt(2), (3,))
vec1=np.array([x_rand[0]-x_rand[1],y_rand[0]-y_rand[1]])
vec2=np.array([x_rand[1]-x_rand[2],y_rand[1]-y_rand[2]])
vec3=np.array([x_rand[2]-x_rand[0],y_rand[2]-y_rand[0]])
ipro=np.array([vec1[0]*vec2[0]+vec1[1]*vec2[1],vec2[0]*vec3[0]+vec2[1]*vec3[1],vec3[0]*vec1[0]+vec3[1]*vec1[1]])
if np.allclose(ipro&<0, np.array([True, True, True])): sum+=1 return float(sum)/k if __name__=="__main__": ralist=[] for i in range(10): sim_nb = nb.jit(sim) ratio=sim_nb() ralist.append(ratio) print ralist

嘗試了故意寫成for循環然後用numba加速的形式,然而加速效果不好。
這是10次模擬的結果:
[0.27508, 0.27400,0.27343,0.27607,0.27662,0.27639,0.27580,0.27538,0.27519,0.27434]


在matlab上寫了個隨機數程序採用蒙特卡洛方法,得出1*1 正方形內出現銳角三角形的可能性約為0.274291 (計算時採用1000000次 loops。
1*1*1 立方體內出現銳角三角形可能性約為 0.456764。

同時還粗略估算了下在以上二維和三維中出現直角的概率,非常難得到非0值。


編程序的方法挺機智,給點個贊!

將1×1的正方形化成99×99的等距網格,得到100×100個節點,不重複任取不在一條直線上的三個點得到所有的三角形,再對三角形進行計算判斷是否為銳角,簡單暴力,跑程序瞬間可以算出來。

對於取樣方法:

正方形中的每個點其實是同質的(?),對正方形內所有點取三角形其中有很多點是幾何上重複的,分子和分母同比例增加。我想如果劃成99×99個節點,固定正方形中心的點為三角形的一個點,在其他所有點中任取兩個(不重複不同線)進行取樣,是否也可以計算出同樣的結果?

如果可以,那麼正方形的上下兩半或左右兩半也是重複的,不如將正方形一分為兩個等面積長方形,以一個長邊的中點為固定點,在長方形內取兩點得到三角形,是否也可以計算出同樣的結果?

在上班沒法編程序….純粹開腦洞,不知道我這個邏輯是否正確……求驗證!

那麼繼續開腦洞吧!

雖然沒有清晰的邏輯思路,但是感覺上這個問題與「在一個圓(邊)上任意取三點得到的三角形是銳角三角形的概率是多少?」結果應該一致…..猜的,哪位大俠來計算一下?


圓內取三點,這個概率是0.280325,不知道算錯沒有


由於之前未考慮在(0,t)內的點形成的鈍角,故修改如下:
當第二個點為t時,第三個的形成銳角三角形的概率為P(t)(如圖)。
而每個點t出現的概率為dt/2x。
所以:(見下圖)

-----------------------華麗的分割線,以下並未考慮在區域內的鈍角三角形,且t出現的概率貌似錯誤,以上為修改版----------------------------------------------------------------------------------------------------------首先考慮1*1大小和2*2大小乃至n*n大小的平面是否等效的問題,從放大和縮小的角度來說,應該是等效的,所以可以考慮整個平面上任意3點銳角三角形的概率。等效於將一個點定在原點,另兩個點任取,同時等效於第一個點定在原點,第二個點定在x軸,第三個點任取的概率。不知道如下過程是否正確。


等於0或者1/4,利用三角形角平分線交於一點,任意一個三角形的角平分線焦點與三個頂點都形成3個鈍角三角形,並且生成的三個鈍角三角形都對應同一個銳角三角形。
其次,生成的鈍角三角形仍然可以無限按上述步驟分解,最終一個銳角三角形可以對應無窮多個鈍角三角形
類似於90,45,22.5,一直下去,小於90度的會有無窮多個

一個銳角三角形對應無窮多個鈍角三角形,並且這些鈍角三角形都對應同一個銳角三角形,這裡的鈍角三角形位置數據是相關性很強的,而電腦生產的隨機數沒相關性。隨機抽的話,應該接近1/4。因為接著分解的三角形都是相關的
-----------------------------------------之前的答案分割線-----------------------------------------------------------------------------------
接近1/4或者等於0....,因為一個銳角三角形可以構造出3個鈍角三角形
構造方法有很多種,(重心構造,外角構造等),但任何一種構造都是在大多數情況下是1:3,剩下的不是1:3的雖說也是不可數的,但是遠比是1:3的數量少


推薦閱讀:

數學中有哪些巧合讓人眼前一亮?
是否任意自然數都能被不相同的斐波那契數之和表示?
這道數學題這麼難? 求解?
根號 π 等於多少?
100個人求職,公司要怎樣才能取到這100個人當中的最好的那個人的概率最大?

TAG:數學 | 趣味數學 | 概率 | 高等數學 | 概率論 |