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>';
我试图创建一个简单的密码生成器并注意到 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>';