1 min read

Doves | 梁朝伟喂鸽子

最近有个好玩儿的事情,起因是这样的。网上有许多“恶搞”物理题目表述,比如这个:

在一个烟雨蒙蒙的清晨,你站在窗前,感慨万千,曾经失落过,但一切的曾经代替不了现在的行走,活在当下,曾经终究不是未来,水一滴一滴从屋檐自由落下,你的思绪也随它荡漾开来,突然发现当它通过屋檐下高为1.4m的窗户时,用时0.2s,空气阻力不计,取g=10m/s2。求此窗户离屋檐的距离。

我给Z同学出了几个后,被其反问了一个很有趣的问题:

梁朝伟在伦敦喂鸽子,每头喂一个面包屑就会有两只鸽子争抢,抢到的概率均等。假设广场上有100只鸽子,每只鸽子吃一片面包屑需要一秒钟,累计吃十片面包屑就吃饱飞走了,没吃到的会一直抢,直到吃饱为止,但如果累计10次没抢到就累觉不爱飞走了。问梁朝伟需要至少准备多少面包屑,才能保证观看鸽子吃食的时间最长。


理想情况下,100只鸽子各吃到9片,抢但没吃到9次,这时梁朝伟投喂了900片,接下来,每头喂一次就会有一直吃饱飞走,一只累计10次没吃到飞走,也就是在投喂50次就够了,共计950片。不过实际情况肯定要比这个少。

不知道大家想没想到如何求解析解,我目前还没解出来,不过拿Python写了个小脚本求了下数值解,大概830-850多片就够了。

    #!/usr/bin/env python
"""
Simulation of the dove model
"""
# -*- coding: utf-8 -*-

import random

doves = {}
alpha = 10

for i in range(100):
        doves[i] = [0,0] #每个鸽子有一个list,第一个存吃的次数,每二个存没抢到的次数

t = 1

while t < 10000 and len(doves) >= 2:
        a = random.sample(doves,2) #从dove中选两只出来

        doves[a[0]][0] += 1 #第一只得到吃的
        doves[a[1]][1] += 1 #第二只没得到吃的

        t += 1

    #如果一只鸽子累计得到10次或者没得到10次,就从总的中删除
        if doves[a[0]][0] >= alpha:
            del doves[a[0]]

        if doves[a[1]][1] >= alpha:
            del doves[a[1]]

print "The total time is:", t 
print "The last dove is:", doves