可以从最简单情况开始考虑:如果密码只有两位,随机给一位,应该怎么做
那么就是随机N次,把N次的结果分类计数。如果有两个bucket,比如是x和y,那么密码
应该是xy或者yx。如果只有一个bucket,比如是x,那密码就是xx。
那么三位密码随机给两位,应该有C(3,2) = 3个bucket.
比如xy, yz和xz,那么密码应该是xyz。
如果是xy, yx, yy,那么密码就是yxy.
但是也有可能是两个bucket,比如xy(bucket count = 2N/3), yy (bucket count = N
/3), 那么三个bucket其实是xy, xy和yy, 密码是xyy.
也有可能是一个bucket,xx (bucket count = N),那么三个bucket其实是xx,xx和xx
,密码是xxx。
六位密码随机给三位,应该有C(6, 3) = 20个bucket。
比如密码是google
那么着二十个bucket是
goo, gog, gol, goe, gog, gol, goe, ggl, gge, gle, oog, ool, ooe, ogl, oge,
ole, ogl, oge, ole, gle
那么以g开头的bucket最多,11个,并且多余C(5,2)=10, 说明password首字母应该是g,
并且应该有一个g在后面 因为11-10=1那么第二个g只能在倒数第三位了。
以o开头的bucket第二多,有9个,多余C(4,2)=6, 说明password第二字母是0,并且有
一个o在后面。9-6=3=C(3,2),说明第二个o在倒数第四位.
反过来看,以e结尾的bucket有正好10个,说明e是尾字母,以l结尾的bucket有正好6个
,说明l是倒数第二个字母。
那么密码是google。
如果密码是aaaaaa, 那么应该20个bucket都是aaa, 也可以得出密码是aaaaaa的结论。
不过这不是程序,只是思路。