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