PHP array_rand奇怪的行为

时间:2015-03-19 08:05:41

标签: php random

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

<?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数组基本上包含一遍又一遍重复的相同结果;如果我刷新页面,只会改变元素的顺序,而不是它们的值。

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

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我认为应该是你的PHP版本。我只是将您的代码复制到我的localhost服务器,它工作正常。我正在使用PHP 5.5.9-1ubuntu4.7,您应该尝试它或更新版本。

enter image description here

顺便说一句,如果您无法更新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>';
?>

答案 2 :(得分:0)

自版本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)];
}

答案 3 :(得分:0)

我花时间为你写了发电机。 我得到它生成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>';