随机字符串生成器返回相同的值


Random String Generator is returning same values

$list_ar = array();
for($x = 0;$x < 500; $x++){
    $val = generateRandomString(20);
    if(!in_array($val,$list_ar)){
        echo $x.'=='.$val.'<br>';
        array_push($list_ar,$val);
    } else {
        echo $x.'== IN ARRAY<br>';
    }
}
function generateRandomString($length){
    $characterlist = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789';
    $characterlist_array = str_split($characterlist);
    $id = '';
    for($a = 0;$a<$length;$a++){
        shuffle($characterlist_array);
        $position = array_rand($characterlist_array, 1);
        $id .= $characterlist_array[$position];
    }
    return $id; 
}

当我运行上面的代码时,它会给出最多 360 lines in array false,之后它会返回in array true。我希望它会在数组中返回 false 最多 500 lines 我已经运行了 20 多次代码,并且它给出了完全相同的结果,即 360 lines in array false.有什么想法吗?

根据 Marc 所说的话,如果将函数更改为:

function generateRandomString($length){
    $characterlist = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789';
    $characterlist_count = strlen($characterlist)-1;
    $id = '';
    for($a = 0;$a<$length;$a++){
        $id .= $characterlist[rand(0,$characterlist_count)];
    }
    return $id; 
}

它仍然失败吗?

由于我们用替代方案回答:

function generateRandomString($length) {
    $characterlist = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789';
    $characterlist_array = str_split($characterlist);
    shuffle($characterlist_array);
    return implode(array_slice($characterlist_array, 0, $length));
}