PHP array_rand 奇怪的行为

PHP array_rand weird behaviour

我试图创建一个简单的密码生成器并注意到 array_rand() returns 相同的结果。这是代码:

<?php
function generatePass() {
    $password = '';
    $a = explode(' ', 'q w e r t y u i o p a s d f g h j k l z x c v b n m');
    for($i=0; $i < rand(1,200); $i++) {
        $password .= $a[array_rand($a)];
    }
    return $password;
}

$r = 0;

while ($r <= 10000) { #generating 10 000 passwords
    $total[] = generatePass();
    $r++;
}
echo '<pre>';
print_r($total);
echo '</pre>';
?>

$total数组基本上包含一遍又一遍重复的相同结果;如果我刷新页面,只有元素的顺序发生变化,而不是它们的值。

问题是:这是预期的行为还是我做错了什么? 谢谢你的关注。

在调用 array_rand 之前用 srand() 重新设置随机数生成器的种子。

srand();
$password .= $a[array_rand($a)];

我想应该是你的PHP版本。我刚刚将您的代码复制到我的本地主机服务器中,并且运行良好。我用的是PHP 5.5.9-1ubuntu4.7,你应该试试或者更新的版本。

顺便说一句,如果您无法更新您的 PHP 版本,请使用您的代码的这个修改版本:

<?php
function generatePass() {
    $password = '';
    // Put all letters into an array.
    $letters = array('q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m');
    for($i=0; $i < rand(1,200); $i++) {
            // Select a random letter with rand() command inside the brackets of the array.
        $password .= $letters[rand(0,25)];
    }
    return $password;
}

$r = 0;

while ($r <= 10000) { #generating 10 000 passwords
    $total[] = generatePass();
    $r++;
}
echo '<pre>';
print_r($total);
echo '</pre>';
?>

自版本 4.2.0 起不需要为随机生成器设置种子

尝试使用 mt_rand() 以获得更好的生成。

http://php.net/manual/en/function.mt-rand.php

编辑:

我想你真的想要

$a = explode(' ', 'q w e r t y u i o p a s d f g h j k l z x c v b n m');
$end = mt_rand(1,200);  
$password = '';
for($i=0; $i < $end; $i++) {
    $password .= $a[array_rand($a)];
}

我抽时间给你写了生成器。 我得到它来生成 10000 个唯一密码并且代码很有效:

<?php

function generatePass() {
    $password = '';
    $lib = 'q w e r t y u i o p a s d f g h j k l z x c v b n m';
    $a = explode(' ', $lib);
    //remove random char
    for($i=0; $i < mt_rand(1,49); $i++) {
        shuffle($a);
        //get Random Char
        $password .= $a[mt_rand(0,count($a)-1)];
    }
    return $password;
}

$len = 10000;  // total number of numbers
$range = array();
foreach(range(0, $len - 1) as $i){
    while(in_array($num = generatePass(), $range)){}
    $range[] = $num;
}
echo '<pre>';
print_r($range);
echo '</pre>';