隨機從1x1大小的正方形平面上取3個點,構成銳角三角形的概率是多少?
如題。。請問這種隨機三角形,構成銳角三角形容易還是鈍角三角形容易???如果算概率的話
謝邀 @Wane Matt
這個問題在A Problem in Geometry Probability一文中已經得到了解決,雖然給題主的問題比好像有一丟丟不一樣。我在這裡搬運主要過程,中間的一些細節大家可以去看原文
paper中的問題是:假設有一個邊長分別為1和L的長方形,隨機選三個點,和,那麼三角形是鈍角三角形的概率是多少?其中,找點的具體方法是設定、、為內均勻分布的隨機變數,、、為內均勻分布的隨機變數
首先簡化問題。三角形是鈍角三角形的概率是的函數,記為,根據對稱性,是三角形中任何一個角是鈍角的概率的3倍。取為例,那麼有,其中
定義,,是鈍角等價於,所以。假設的累積分布函數是,則的累積分布函數就是,則有
,即
所以需要解決的問題。假定條件累積分布函數,則有
是一條雙曲線。當時,是下圖中的陰影部分
需要注意的是這個圖有誤導性,左上角和右下角的兩塊白色區域可能不存在。在時左下角存在,面積為
同理,時右上角存在,面積為
得
由於的取值範圍是,故時,兩塊白色區域不存在,
當時,考慮兩塊區域出現的條件,得
當時,是下圖中的陰影部分
這兩塊陰影面積同樣也可能不存在,但跟前一次的不同,前一次的兩塊可能不是同時存在,這一次的兩塊是同時的,要麼一起有要麼一起沒,存在的條件是,而且兩塊面積相等,分別是
得
由於的取值範圍是,故時,兩塊陰影區域不存在,
當時,考慮兩塊區域出現的條件,得
還剩,取個極限可得
綜上可得(換行大括弧不會打)
於是我們就可以開始算了。看上面的函數形式,的導數即概率密度函數存在,所以
根據對稱性,,所以考慮就行了。在時,積分下限為。若,時;若,時。定義,則
時
時
圖長這樣
也就是說如果隨便取,那應該是正好在正方形時達到最低點,大約為0.725。而三角形是直角三角形以及正好排在一條直線上的概率顯然都是0,故是銳角三角形的概率大約是0.275,跟其他同學的模擬吻合。最後,時就相當於把的情況給「壓扁」了一點,從直觀上看,正方形中找到的鈍角三角形被壓了之後還是鈍角三角形,然而有些銳角三角形就變成了鈍角三角形,壓得越「厲害」就越多,所以相應的,在時會隨著變大而變大
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]&
}
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。
編程序的方法挺機智,給點個贊!
將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個人當中的最好的那個人的概率最大?