如何解决随机生成的字符串,可能等于?
| 给定一个脚本,该脚本生成一个随机生成的12个字符的字符串,那么两个字符串相等的可能性有多少?function rand_string( $length ) {
$chars = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMnopQRSTUVWXYZ0123456789\";
$size = strlen( $chars );
for( $i = 0; $i < $length; $i++ ) {
$str .= $chars[ rand( 0,$size - 1 ) ];
}
return $str;
}
解决方法
假设
A-Za-z0-9
,可能有62个字符值。因此,有62 ^ 12个(以幂为单位)可能的字符串。大约是3x10 ^ 21(3个带有21个零)。
假设有一个完美的随机数生成器,则任何两个特定字符串相等的几率为3x10 ^ 21的1。
,给定该代码且长度为12,则可能有6212个值。因此(假设完全统一的随机数生成器,,2ѭ可能不是),则在3226266762397899821056中有1个机会一次调用该函数将返回任意12个字符的字符串。
OTOH,如果您要反复调用该函数,并且想知道要等多久才能获得之前返回的任何值的重复,则必须调用它约6.7e + 10次,才有50%的机会发生冲突(同样,假设使用统一的随机数生成器)。通过计算sqrt(-ln(1 - p) * 2 * 6212)
,您可以合理估计在0和1之间的任何碰撞概率p所需的呼叫数量。
,这属于“出生悖论”(您在一个房间中需要多少人才能让两个或更多人有相同生日的机会达到50%)。
您的12个长度为62个字符的字符串大约为72位。使用此处详细介绍的近似值,您可以期望在发生碰撞之前生成大约SQRT((pi / 2)* 62 ^ 12))= 7.112x10 ^ 10个字符串。因此,约有700亿分之一。