随机弦之长

题目:

在一个半径为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'即为所选取的弦。

随机弦之长_第1张图片

选定点 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的连线,与圆相交得所选取的弦。

随机弦之长_第2张图片

若弦长 c小于半径 r,则有 c 2 <= (AC 2 - d 2) / 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,再由此作弦。

随机弦之长_第3张图片

假设距离 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()

做完这道题,不由得发问:为什么选择不同的随机选取方式,结果会有这么大的差异呢?这三种随机选取方式的本质不同又是什么呢?

你可能感兴趣的:(随机弦之长)