让人类在1到10(包括1和10)之间随机命名一个整数。每个数字被选中的概率是10%吗?当然,答案是否定的。
半年前有人对8500名学生做了一个调查,发现人类似乎对7特别偏爱。其中有近30%的人会选择7,但选择两端数字的概率会太小,甚至只有1.9%的人会选择10。
如果使用计算机,我们可以生成几乎完全随机的数字,保证每个数字被抽中的概率是10%。(注:其实是计算机生成的伪随机数,不是完全随机的,但效果远胜于人类。)
在这个看似超级简单的事情上,人脑输给了计算机。人类随机函数hu*n.random在Numpy中远远小于np.random。
难怪推特网友调侃:智人从30多万年前诞生到现在,都没能解决这个问题。
因为人类是有情绪的:1和10在两端,选择这两个数字是否过于刻意?7是我的幸运数字吗?你潜意识的想**影响你最终的选择。
那我该怎么办?
怎样才能把人类的随机函数变成真正的随机函数?我们要做的就是把概率分布大于10%的数移到概率小于10%的数。
你可以想象将这些长条切碎,然后重新排列,使它们高度相同:
举个极端的例子,假设我们把每一个长条都“切割”成无穷小的块,然后我们就可以像乐高一样用这些块来建立任意形状的概率分布。
现在,让我们定义这样一个变量xi,J,它表示我们调整的数量为I的样本占总数量为I的样本的比例。
因为选择7的人比较多,我们希望把7部分调整为1。如果7的20%变成1,那么x7,1=0.2。Xi,我代表未调整的部分。
最后,我们希望所有随机数的概率都是0.1,那么调整到J中的其他数的比值之和应该满足:
同时要保证原始分布中的所有概率质量都是守恒的。所以每个I调整为1到10的总概率应该等于1(注:原文与数字I最初被选中的概率Pi相同)。
此外,我们还想尽可能保持原来的分布,即最大化xi,I(保持不变的部分)之和,也就是尽可能保持不变的部分。
现在这个问题变成了线性规划问题。在这20个约束条件下,对角元素之和最大化。
经计算机计算,调整方案如下:
这个结果虽然直观,但是不够准确。准确的调整比率为:
根据上图,选择7的结果有28%需要调整为10,20%需要调整为1,以此类推。
但是28%和20%的比例怎么取,初始随机分配表就行了。
本来有28%的人选择了7。如果我们得到一个7,我们问第二个人。如果我们也得到一个7,我们就把前7个强制变成1。
人脑随机数发生器
现在你明白了人类随机数发生器的工作原理,下面是这个程序的“源代码”。
根据这个程序,你应该可以得到一个从1到10的平均随机数生成器,前提是你有8500个人。