有一道概率的数学题,我想用模拟证实一下答案,结果完全不对,求查错,代码是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)