给定一个生成随机生成的12个字符的字符串的脚本,两个字符串相等的可能性有多少?
function rand_string( $length ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$size = strlen( $chars );
for( $i = 0; $i < $length; $i++ ) {
$str .= $chars[ rand( 0, $size - 1 ) ];
}
return $str;
}
答案 0 :(得分:5)
假设A-Za-z0-9
,有62个可能的字符值。因此,有62 ^ 12(对于权力)可能的字符串。这大约是3x10 ^ 21(3个,有21个零)。
假设一个完美的随机数生成器,那么任何两个特定字符串相等的可能性为3x10 ^ 21。
答案 1 :(得分:1)
鉴于该代码和长度为12,有62个 12 可能的值。所以(假设一个完全统一的随机数生成器,rand()
可能不是),3226266762397899821056中的机会是1,单个调用该函数将返回任意12个字符的字符串。
OTOH,如果你反复调用这个函数并且想知道你可能会重复多次以前返回的值,你将不得不称它为6.7e + 10次以获得50%的几率碰撞(再次,假设一个统一的随机数发生器)。通过计算sqrt(-ln(1 - p) * 2 * 6212)
,您可以得到0到1之间任何碰撞概率 p 所需的调用次数的合理近似值。
答案 2 :(得分:1)
这属于出生悖论(在一个房间里你需要多少人才有两个或更多人有相同生日的50%几率)。
你的12长62字符串大约是72位。使用近似详细的here,您可以在发生碰撞之前生成关于SQRT((pi / 2)* 62 ^ 12))= 7.112x10 ^ 10个字符串。所以大约有七分之一的人。