Страница 1 из 1

Сложности с ПХП рандомайзером.

Добавлено: 21 дек 2010, 15:48
Support
Недавно было замечено, что не смотря на
http://www.php.su/functions/?f=array_rand&choice=info писал(а):"Начиная с PHP 4.2.0, больше нет необходимости инициализировать генератор случайных чисел функциями srand() или mt_srand(), поскольку теперь это происходит автоматически."
скрипт генерации логинов и паролей gen_login_pass выдавал великое множество повторов.

К примеру, попробуйте запустить это:

Код: Выделить всё

// функция генерации логина
function generate_login($len)
{
$r = '';
$allowedSymbols = array('b','a','c','e','d','o','f','i','g','u','h','o','j','e','k','o','l','e','m','u','n','o','p','a','q','e','r','o','s','i','t','u','v','e','w','a','x','o','y','i','z');
for ($i=0; $i<$len; $i++)
{
//srand((float) microtime() * 10000000);
  $rand=array_rand($allowedSymbols);
  if ($i % 2 == 0)
  {
   while($rand% 2 != 0)
   {$rand=array_rand($allowedSymbols);}
   $r.=$allowedSymbols[$rand];
  }
  else
  {
     while($rand% 2 == 0)
   {$rand=array_rand($allowedSymbols);}
   $r.=$allowedSymbols[$rand];
  }
}
 
return $r;
}

for ($i=0;$i<1000;$i++)
{
$f = fopen ('C:\123.txt','a+');
$emails=generate_login(rand(7,11));
//sleep(1);
$test = file('C:\123.txt');

for ($ii=0; $ii<=count($test); $ii++)
{
if ($emails == trim($test[$ii])) echo "Логин $emails уже встречался!!! <br>";
}
fwrite ($f, $emails."\r\n");
echo $emails."<br>";
fclose ($f);
}
Однако, если раскомментить строку srand((float) microtime() * 10000000); , то повторы исчезнут.

Re: Сложности с ПХП рандомайзером.

Добавлено: 22 дек 2010, 03:25
wal
это проблема array_rand и проявляется только под виндой,

rand отрабатывает корректно...

$rand=array_rand($allowedSymbols) замените на

$rand=rand(0,count($allowedSymbols)-1) и все будет отлично...

Re: Сложности с ПХП рандомайзером.

Добавлено: 22 дек 2010, 06:38
satih
да и в принципе генерацию логина можно/лучше делать без массива, str_shuffle в помощь