我试图创建一个简单的密码生成器,并注意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
数组基本上包含一遍又一遍重复的相同结果;如果我刷新页面,只会改变元素的顺序,而不是它们的值。
问题是:这是预期的行为还是我做错了什么? 请你注意。
答案 0 :(得分:0)
在调用array_rand
之前,使用srand()
重新设置随机数生成器。
srand();
$password .= $a[array_rand($a)];
答案 1 :(得分:0)
我认为应该是你的PHP版本。我只是将您的代码复制到我的localhost服务器,它工作正常。我正在使用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>';
?>
答案 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>';