4只鸭子在同一个圆圈内游泳,问:4只鸭子出现在同一个半圆内的概率是多少?Python解答

时间:2025-01-26 09:44:57

看到这个问题有些晚了,不过也挺感兴趣,索性花了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
"""
由此可知,此题答案为1/2