在实践蒙特卡洛算法中的问题
  • 板块学术版
  • 楼主Acfboy
  • 当前回复13
  • 已保存回复13
  • 发布时间2020/10/11 19:38
  • 上次更新2023/11/5 11:02:02
查看原帖
在实践蒙特卡洛算法中的问题
40318
Acfboy楼主2020/10/11 19:38

有一道概率的数学题,我想用模拟证实一下答案,结果完全不对,求查错,代码是python写的。

半径为1和2的两个同心圆,任意大圆的弦和小圆交的概率?

# 使用计算机模拟那道众所周知的新方法题:
# 半径为1和2的两个同心圆,大圆的弦和小圆交的概率
import random
import math

O_x = 100; O_y = 100; # 圆心坐标
r = 50; R = 100; # 小圆和大圆半径

PassLC = 0; tot = 0;
# 经过小圆/经过大圆

for i in range(1, 10000): # 模拟好几次
    A_x = 0.0; B_x = 0.0; A_y = 0.0; B_y = 0.0;
    # 设为浮点数
    while(A_x == B_x and A_y == B_y):
        A_x = random.randint(0, 200000000) / 1000000.0
        A_y = random.randint(0, 200000000) / 1000000.0
        B_x = random.randint(0, 200000000) / 1000000.0
        B_y = random.randint(0, 200000000) / 1000000.0
        # 随机两个点用于构造直线
    
    k = (A_y-B_y) / (A_x-B_x)
    b = A_y - A_x*k

    d = abs((k*O_x - O_y + b) / ((k*k + 1) ** 0.5))
    # 点到直线距离公式
    
    if(d <= r): 
        PassLC += 1
    tot += 1

ans = 0.0
ans = PassLC/tot # 算出概率
print('%.5f' % ans)
2020/10/11 19:38
加载中...