生日悖论,或为什么PRNG产生重复的次数超出您的想象。
OP的问题有两个问题。一是生日悖论如上所述,第二个是您生成的内容的性质,它不能固有地保证不会重复给定的数字。
生日悖论适用于在生成器周期内给定值可能多次出现的情况,因此在值样本中可能出现重复项。生日悖论的影响在于,获得此类重复的真实可能性非常大,并且两次重复之间的平均时间比原本可能认为的要短。感知概率与实际概率之间的这种不一致使“生日悖论”成为认知偏差的一个很好的例子,在这种情况下,单纯的直观估计很可能是错误的。
伪随机数发生器(PRNG)的快速入门
问题的第一部分是您要获取随机数生成器的公开值并将其转换为更小的数字,因此可能值的空间减少了。尽管某些伪随机数生成器在其周期内不重复值,但此转换将域更改为更小的域。较小的域会使“不重复”条件无效,因此您可以预期出现重复的可能性很大。
一些算法,例如线性同余PRNG(A'=AX|M
)确实可以保证整个周期的唯一性。在LCG中,生成的值包含累加器的整个状态,并且不保留任何其他状态。生成器是确定性的,不能在周期内重复一个数字-任何给定的累加器值都只能表示一个可能的连续值。因此,每个值只能在生成器周期内出现一次。但是,这种PRNG的周期相对较小-对于LCG算法的典型实现,约为2 ^ 30-并且不可能大于不同值的数量。
并非所有的PRNG算法都具有此特征。有些可以在一段时间内重复给定的值。在OP的问题中,Mersenne Twister算法(在Python的随机模块中使用)的周期非常长-远大于2 ^ 32。与线性同余PRNG不同,结果不完全是先前输出值的函数,因为累加器包含其他状态。对于32位整数输出和大约2 ^ 19937的周期,它可能无法提供这样的保证。
Mersenne Twister是PRNG的一种流行算法,因为它具有良好的统计和几何特性,并且具有很长的周期-这是用于仿真模型的PRNG的理想特性。
良好的统计特性意味着算法生成的数字分布均匀,没有其他数字比其他数字具有更高的出现概率。不良的统计属性可能会在结果中产生不需要的偏斜。
好的几何特性意味着N个数的集合不在N维空间的超平面上。不良的几何特性会在仿真模型中生成虚假的相关性,并使结果失真。
较长的时间意味着您可以在序列结束之前生成大量数字。如果模型需要大量迭代或必须从多个种子运行,则典型LCG实现中可用的2 ^ 30左右离散数可能不足。MT19337算法的周期非常长-2 ^ 19337-1,或大约10 ^ 5821。相比之下,宇宙中的原子总数估计约为10 ^ 80。
MT19337 PRNG生成的32位整数可能无法表示足够的离散值,以免在如此大的时间段内重复。在这种情况下,可能会出现重复的值,而对于足够大的样本则不可避免。
简而言之的生日悖论
此问题最初定义为房间中任何两个人共享同一生日的概率。关键是房间中的任何两个人都可以分享生日。人们倾向于天真地将问题误解为房间中某人与特定个人分享生日的概率,这是认知偏见的根源,这种偏见经常导致人们低估该可能性。这是不正确的假设-不需要将匹配匹配到特定个人,并且任何两个个人都可以匹配。
在任何两个人之间发生匹配的可能性要比与特定个体匹配的可能性高得多,因为该匹配不必一定是特定日期。而是,您只需找到两个共享相同生日的人。从该图(可以在主题的Wikipedia页面上找到)中,我们可以看到房间中只需要23个人,就有50%的机会找到以这种方式匹配的两个人。
从有关该主题的Wikipedia条目中,我们可以获得一个不错的摘要。 在OP的问题,我们有4500可能的“生日”,而不是365。生成的给定数量的随机值(等同于“人”),我们想知道的概率任何序列中出现两个相同的值。
计算生日悖论对OP问题的可能影响
对于100个数字的序列,我们有可能匹配的
对(请参阅了解问题)(即第一个可以与第二个,第三个等匹配,第二个可以与第三个,第四个等匹配,依此类推),等等可能匹配的组合数量不止100个。
通过计算概率,我们得到的表达式
。下面的以下Python代码片段对匹配对的发生概率进行了简单的评估。
from math import log10, factorial
PV=4500
SS=100
numerator = factorial (PV)
denominator = (PV ** SS) * factorial (PV - SS)
log_prob_no_pair = log10 (numerator) - log10 (denominator)
print 1.0 - (10 ** log_prob_no_pair)
对于从4500个可能值的总体中采样的100个数字中发生的匹配,这会产生合理的p = 0.669的查找结果。(也许有人可以对此进行验证并在错误的地方发表评论)。由此可见,OP观察到的匹配数之间的游程长度似乎很合理。
脚注:使用改组获得唯一的伪随机数序列
请参阅S.Mark的以下答案,以获取一种保证唯一的随机数集的方法。张贴者所指的技术采用一组数字(您提供这些数字,以便使它们唯一),然后将它们随机排列。从改组后的数组中按顺序绘制数字将为您提供一系列伪随机数,保证不会重复。
脚注:加密安全的PRNG
MT算法不是密码安全的,因为通过观察数字序列来推断发生器的内部状态相对容易。其他算法(例如Blum Blum Shub)用于加密应用程序,但可能不适用于模拟或通用随机数应用程序。加密安全的PRNG可能很昂贵(也许需要大数运算),或者可能没有良好的几何特性。在这种算法的情况下,主要要求是通过观察值序列来推断生成器的内部状态在计算上是不可行的。