基于字符串长度和可能字符的简单组合/概率问题


9

假设“完全随机”,并给出一个长度为20个字符的字符串,其中每个字符可能是62个可能的字符之一:

  • 总共可能有多少种组合?(将20乘以62的幂。)
  • 另外,如果新的字符串是一个接一个地随机选择的,并添加到到目前为止选择的字符串列表中,那么在选择已经选择的字符串之前,必须选择多少个字符串的比例低于1到100000()?105

注意: 62来自:数字(0-9),大写字母(AZ)和小写字母(az)。


2
可以用(至少)两种可能的方式来读取第二个要点。我想知道您对哪个感兴趣。(1)第个字符串与先前的字符串之一匹配的概率,或者(2)在选择第个字符串时,集合中存在某些重复项的概率到目前为止绘制的字符串。这两个问题的答案将有很大不同。:)nn
红衣主教

1
也许考虑使用两个字符的字母可以使区别清楚。让字母和。我们可以问:(1)对于,我们至少有99%的机会使字符串与先前的字符串重复吗?这里的是8,因为我们唯一失败的方法是序列是或,其总概率为。或者,我们问(2)对于什么我们至少看到了一些重复的99%的机会?在这种情况下因为到那时我们已经看到了三个字符串HTnnnTTTTHHHHHT2(n1)nn=3H或已重复至少一次。T
主教

1
Matt的答案句柄(1)本质上回答了有关“我的”字符串是否与其他人的字符串匹配的问题。但是,如果您担心另外两个人的字符串可能匹配,那么您会对(2)感兴趣。这取决于您是否要与所有其他字符串进行比较的特定字符串,或者是否要将所有字符串彼此进行比较。不过,我不确定是否要更清楚地说明这一点。(您的问题归结为著名的所谓“生日问题”的两个变体之一。)
红衣主教2012年

1
像往常一样,红衣主教是正确的。我假设您有一个“目标”字符串,为此您生成了一个猜测列表。如果相反,您是随机生成字符串,并且想知道在任意两个字符串匹配之前可以安全生成的数字,那么答案的确是非常不同的。如果可以的话,我会修改我的回答以解决该问题。
马特·克劳斯

1
我没有完全弄清楚前面的示例。对于那个很抱歉。我正在考虑一个两个字母的字母并绘制长度为1的字符串。因此,当我写,其主张,,...,,。{H,T}HHHHTs1=Hs2=Hsn1=Hsn=T
主教

Answers:


11

可能性总数

1)关闭!第一个字符有62个选择,第二个字符有62个选择,依此类推,因此最终得到,这是一个非常大的数字。62626262=6220

与“目标”字符串的碰撞

2)如上文所述,有潜在字符串。您想知道要猜测“目标”字符串的100,000几率中有多于1的可能性。本质上,您是在问要弄清楚它,您必须四舍五入x(或加一个,如果它们完全相等),但是正如您稍后会看到的那样,这并不重要。6220

x62201105

通过基本代数,我们可以将其重新排列为

105x6220105x(6.210)20105x6.2201020x6.2201015

进行数学计算,约为,因此让我们将整个事情称为或更简洁地说,是很多。6.2207101571030

当然,这就是为什么长密码确实能很好地工作的原因:-)对于真正的密码,您当然要担心长度小于或等于20的字符串,这会增加更多的可能性。

列表中的重复项

现在,让我们考虑另一种情况。字符串是随机生成的,我们想确定在两个字符串匹配的可能性为1:100,000之前可以生成多少个字符串。这个问题的经典版本称为生日问题(或“ Paradox”),询问n个人中的两个人生日相同的概率。Wikipedia文章[1]看起来不错,并且有一些表可能对您有用。不过,我也会在这里尝试提供答案。

注意事项:

-匹配和不匹配的概率之和必须为1,因此,反之亦然。P(match)=1P(no match)

-对于两个独立事件和,的概率。ABP(A&B)=P(A)P(B)

为了得到答案,我们将从计算固定数目的字符串看不到匹配的概率开始。一旦我们知道该怎么做,就可以将该方程设置为等于阈值(1 / 100,000)并求解。为了方便起见,我们将可能的字符串数()称为kkN6220

我们将“遍历”列表,并计算 ^ {th}字符串与列表中“上方”的任何字符串匹配的概率。对于第一个字符串,我们总共有个字符串,并且列表中没有内容,因此。对于第二个字符串,总共仍有个可能性,但是第一个字符串已“用尽”一个可能性,因此该字符串匹配的可能性为对于第三个字符串,有两种匹配方式,因此不匹配,因此,依此类推。一般而言,kNPk=1(no match)=NN=1NPk=2(no match)=N1NN2Pk=3(no match)=N2Nk第个与其他字符串不匹配的字符串为

Pk(no match)=Nk+1N

但是,我们希望字符串中的任何一个都不匹配的可能性。由于所有事件都是独立的(针对每个问题),因此我们可以将这些概率相乘,如下所示: 可以简化一下: 第一步只是将分数相乘,第二步使用阶乘()替换以下产品k

P(No Matches)=NNN1NN2NNk+1N
P(No Matches)=N(N1)(N2)(Nk+1)NkP(No Matches)=N!Nk(Nk)!P(No Matches)=k!(Nk)Nk
k!=(k)(k1)(k2)1Nk+1N则更易于管理,最后一步交换为二项式系数。这为我们提供了一个方程,用于在生成字符串之后根本不匹配的概率。理论上,您可以将其设置为并求解。在实践中,要回答这个问题将很困难,因为您将要乘以/除以大量数字–阶乘的增长非常快(的长度超过150位)。k1100,000k100!

但是,对于计算阶乘和整个问题都有近似值。本文[2]建议,其中p是看不到匹配项的概率。他的测试最多可以得到,但在那里仍然相当准确。插入您的数字,我得到大约。

k=0.5+0.252Nln(p)
N=48,0003.71015

参考文献

[1] http://en.wikipedia.org/wiki/Birthday_problem

[2] Mathis,Frank H.(1991年6月)。“一个广义的生日问题”。SIAM评论(工业和应用数学协会)33(2):265–270。JSTOR链接


+1太好了,很明显我的数学能力很差,导致提出了问题,所以我将在一天之内不回答该问题,但对我来说看起来不错,而且比我想像的要清楚得多-谢谢!
2012年

1
乐意效劳!让我知道是否有任何不清楚的地方。为了踢球,我跑了数字。您将需要7044234255469980229683302646164猜测;就像我说的-很多!
马特·克劳斯

+1 @Matt Krause:+1对答案下方的评论;您的回答和尽可能给出最佳答案的承诺堪称典范,值得一提,并感谢您的辛勤工作!
失误2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.