目前在中文互联网界也十分火的冰桶挑战一开始是由美国肌萎缩性脊髓侧索硬化症协会(简称ALS协会)发起的一项公益募捐活动,它的规则非常简单,被点名的人可以选择将一桶冰水从自己的头顶泼下去,或者向ALS协会捐赠善款。现在,已经有很多名人完成了冰桶挑战,包括比尔盖茨、马克扎克伯格、美国前总统小布什等,果壳网CEO姬十三也在不久前完成了这个挑战项目。
冰桶挑战通常要求被点名者在24小时之内完成挑战(或者进行捐赠),然后再点三个人接棒。这就像是一种病毒,越多的人完成挑战,就会有更多的人被点名。因此,还要多久才能让整个世界都完成冰桶挑战呢?让我们估算一下。
在第一种模型中,我会作出下列假设:某人完成了第一次冰桶挑战;他选择了三个人接棒;这三个人又各自选择了三个人接受同一挑战;每一批被指定者都在被点名的两天后完成这一挑战(所有人完成的时间一致),没有人是拖延症患者;被点名的每个人都是第一次接受冰桶挑战。那么全世界的70亿人口都完成这一挑战,需要多久呢?也许为此建立一个数学模型并不是什么困难的事儿,但是我打算只用Python来完成这一计算。
我所需要做的只是制作一个循环。如果将完成这一挑战的第一个人设定为n1,然后开始循环,那么在一轮循环结束后,完成冰桶挑战的总人数将会是:没错,我可以将这个数字写成4n1,但是我更喜欢现在的写法。下图就是我依据这个公式计算出的,70亿人完成挑战需要多长时间:请注意,纵坐标是以对数尺度表示的。从这张图表中可以看出,不到35天全世界的人就可以完成冰桶挑战。
事实上,在35天之内,完成这一挑战的总人数将超过全世界的总人口数量——我猜这里面八成有火星人。很明显,前一种模式中存在一些问题,我们来做一点修正。如果某人指定一个新人接受挑战,那么其实这个人是否完成过冰桶挑战是有一定概率的。
假设选择到一个新挑战者(从未参与过该挑战的人)的概率取决于冰桶挑战完成者的数量与总人数的比值,那么,对每一批挑战者来说,选到新人的概率会是:所以在挑战刚开始的时候,找到一个新人的概率是100%,因为还没有无进行过挑战。不过在大多数人都已经完成该挑战后,找到新人的概率就会变得很低了。我们来建立一个模型。
理想状况下,我可以列出一张人名表,在每个冰桶挑战中,我会使用一个随机函数来决定这些人中哪些来接受新的挑战,然后再看一下他是否已经接受过该挑战。但是我不打算这样做,为什么呢?因为我可不想去处理一张有着70亿个项的列表。所以我打算偷点懒。假设地球上就100个人,其中的80个已经完成了冰桶挑战,那么他们选择新人时,选中已经完成挑战的人的概率为80%,也就是说只有20%的人会去进行挑战。
这样一来我就无需再使用随机函数来进行选择了,就假设只有20%的人会被真正选中。这个假设算不上太糟糕(虽然它不太准确)。下图中将两个冰桶挑战模型一同列出了。总体来说,新模型与旧的差不多。这是为什么呢?让我们回顾一下冰桶挑战的第29日:这一天约有2.68亿人完成了该挑战,这样就剩下将近70亿人还没进行该挑战。这样,模型2号中概率的微调就显得无关紧要了。
只有在最后一轮的时候,你可以看到两种模型之间的差距。不过无论如何,全世界的人最后都会被冰水覆盖的。