题目:
在一个半径为r
的圆中,随机选取一条弦,则这条弦的弦长c
比半径r
长的概率是多少?
![](http://7xl5w6.com1.z0.glb.clouddn.com/20170630141217.png? imageView2/1/w/600/h/400/format/webp/q/75|watermark/2/text/5oKf56m6/font/5b6u6L2v6ZuF6buR/fontsize/320/fill/IzAwMDAwMA==/dissolve/100/gravity/SouthEast/dx/10/dy/10|imageslim)
分析一:
先在圆上随机选取一点A
,再在圆上随机选取另一点A'
,则线段AA'
即为所选取的弦。
选定点
A
后,需满足AA' >= r
,即∠A'CA
不小于π/6
,因此P = 1 - ((π/6) * 2) / π = 1 - 1/3 = 2/3
import random
import math
r = 1
def random_point():
while True:
rho = random.uniform(0, math.pi * 2)
x = r * math.cos(rho)
y = r * math.sin(rho)
return x, y
def main():
c = (math.sqrt(3) / 2) * r
acc = 0;
acc_exceed = 0
while acc < 10000:
x1, y1 = random_point()
x2, y2 = random_point()
d = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
if d >= r:
acc_exceed += 1
acc += 1
print float(acc_exceed) / float(acc)
if __name__ == '__main__':
main()
分析二:
先在圆内随机选取一点E
,以此点作为弦的中点,过点E
作一条直线,且垂直于点E
与圆心O
的连线,与圆相交得所选取的弦。
若弦长
c
小于半径r
,则有
c2 <= (AC2 - d2) / 4
,得c’ = (厂3)r/2
。当点E
在半径为c’
圆内时,构成的弦则满足题目要求,于是可以用圆的面积来求概率,得P = π*c'*c' / π*r*r = 3/4
。
import random
import math
r = 1
def random_point():
while True:
x = random.uniform(0, r)
y = random.uniform(0, r)
d = math.sqrt(x*x + y*y)
if d <= r:
return d
def main():
c = (math.sqrt(3) / 2) * r
acc = 0
acc_exceed = 0
while acc < 10000:
d = random_point()
if d <= c:
acc_exceed += 1
acc += 1
print float(acc_exceed) / float(acc)
if __name__ == '__main__':
main()
分析三:
弦距离圆心的长度d
的取值范围为[0, r)
,随机生成弦到圆心的距离d
,再由此作弦。
假设距离
d
在[0, 1)
上服从均匀分布,那么概率为P = (厂3) / 2
。
import random
import math
r = 1
def random_point():
return random.uniform(0, r)
def main():
c = (math.sqrt(3) / 2) * r
acc = 0;
acc_exceed = 0
while acc < 1000000:
d = random_point()
if d <= c:
acc_exceed += 1
acc += 1
print float(acc_exceed) / float(acc)
if __name__ == '__main__':
main()
做完这道题,不由得发问:为什么选择不同的随机选取方式,结果会有这么大的差异呢?这三种随机选取方式的本质不同又是什么呢?