看到这个问题有些晚了,不过也挺感兴趣,索性花了5分钟写了个Python的。发现已经有许多其它博主使用了编程来进行解答,我看了个Java的,思路也是大同小异。在此之前我已在百度知道上进行了回答
问题:
既然是概率问题,那么就该严谨化,so,我们可以遵守“游泳池”是一个很大很大的圆,而“鸭子”则是完全随机的
没有大小的质点,而不是某些大聪明说的鸭子喜欢成群结队吃东西这个大前提。
思路:
什么样的情况下才算是在同一半圆?我们可以这样理解,四只鸭子中,只要有任意一只鸭子与圆心的直线,
能够包含其它三只鸭子(无论左侧还是右侧),那么就是在同一个半圆。so,结果的概率与鸭子距离圆心
多远并没有关系,而是与鸭子与参考平面的角度有关系[0°-360°)。
编码:
import random
# 获取随机的角度值,当做是鸭子的位置
def getRandom():
return random.random() * 360
# 执行一次
def runOne():
# 生成四只鸭子
durk1 = getRandom()
durk2 = getRandom()
durk3 = getRandom()
durk4 = getRandom()
# 在同一半圆, 证明只要有任何一只鸭子与圆心的直线的任何一端(左侧或者右侧), 能够包含其它三只鸭子就算是在同一半圆
# 假如鸭子1 是30度, 只需要有其它三只均是[30, 210] 或者是 [0,30] & [210, 360]
# 对四个鸭子 进行判断
if durk1 == durk2 == durk3 == durk4:
# 全都一样,特别是全在圆心的情况
return True
if check(durk1, durk2, durk3, durk4):
return True
if check(durk2, durk1, durk3, durk4):
return True
if check(durk3, durk2, durk1, durk4):
return True
if check(durk4, durk2, durk3, durk1):
return True
return False
def check(a, b, c, d): # 后面三个参数的顺序无影响, 第一个参数代表以他为直线
if a == 0:
# 排除在圆心
return False
if a > 180:
# 使得a+180 < 360
a = a - 180
# 区间 = [a,180+a]
result = 0
if a <= b <= (180 + a):
result += 1
if a <= c <= (180 + a):
result += 1
if a <= d <= (180 + a):
result += 1
# result==0 或者 result == 3证明是在同一侧
return result == 0 or result == 3
if __name__ == '__main__':
count = 0
numbers = 100000000
for i in range(numbers):
# 循环一亿次数
if runOne():
count = count + 1
print("count: " + str(count))
print("概率为: " + str(count / numbers))
""""
一千万次:
count: 4999275
概率为: 0.4999275
一亿次:
count: 49999763
概率为: 0.49999861
"""