Jump to content
  • 0

Исключение повторений случайных чисел


bgraf
 Share

Question

Добрый день!

Подскажите, при запуске нижеприведенного кода , я предполагал получить массив с случайными числами, которые бы не повторялись, но при рекурсии получается пустая строка.

Вот код.


$rand_numbers = array();
function create_rand_num($t_rows,$r_numbers)
{
$r_n = mt_rand(0, $t_rows);
if(!in_array($r_n,$r_numbers))
{
return $r_n;
}
else
{
create_rand_num($t_rows,$r_numbers);
}
}
while (count($rand_numbers) < $per_page)
{
$rand_numbers[] = create_rand_num($total_rows,$rand_numbers);
}

for($i=0;$i<$per_page;$i++)
{
echo($rand_numbers[$i]."<br />");
}

а вот пример вывода массива


11
4
8
13


2
1

7

$total_rows = 13

$per_page = 10

Что-то не могу понять что я натворил .

Спасибо

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Вот в таком варианте работает

<?php
$total_rows = 13;
$per_page = 10;
$rand_numbers = array();
function create_rand_num($t_rows,$r_numbers)
{
$r_n = mt_rand(0, $t_rows);
if(in_array($r_n,$r_numbers))
$r_n=create_rand_num($t_rows,$r_numbers);
return $r_n;
}
while (count($rand_numbers) < $per_page)
{
$rand_numbers[] = create_rand_num($total_rows,$rand_numbers);
}

for($i=0;$i<$per_page;$i++)
{
echo $rand_numbers[$i]."<br />";
}

?>

Edited by Burevestnik
Link to comment
Share on other sites

  • 0

Вот в таком варианте работает

<?php
$total_rows = 13;
$per_page = 10;
$rand_numbers = array();
function create_rand_num($t_rows,$r_numbers)
{
$r_n = mt_rand(0, $t_rows);
if(in_array($r_n,$r_numbers))
$r_n=create_rand_num($t_rows,$r_numbers);
return $r_n;
}
while (count($rand_numbers) < $per_page)
{
$rand_numbers[] = create_rand_num($total_rows,$rand_numbers);
}

for($i=0;$i<$per_page;$i++)
{
echo $rand_numbers[$i]."<br />";
}

?>

Во первых, и самон главное, СПАСИБО ВАМ ОГРОМНОЕ

сам уже эксперементировал и так и эток.

Но вопрос не идет из головы, где логика компилятора, первый случай со сбоем, а ВАШ работает как ни в чем не бывало

Edited by bgraf
Link to comment
Share on other sites

  • 0

не за что :)

Смотрите у вас получается следующее, если числа нет в массиве тогда срабатывает return $r_n, если число есть в массиве то вы вызываете опять функцию create_rand_num, при этом после того как она отработала т.е. нашла новое случайное число она возвращается туда откуда вызвалась а после нее уже нет возврата значения и поэтому у вас получался пустой элемент массива

вот доработанный ваш вариант - думаю разберетесь

$total_rows = 13;
$per_page = 10;
$rand_numbers = array();
function create_rand_num($t_rows,$r_numbers)
{
$r_n = mt_rand(0, $t_rows);
if(!in_array($r_n,$r_numbers))
{
return $r_n;
}
else
{
$r_n = create_rand_num($t_rows,$r_numbers);
return $r_n;
}
}
while (count($rand_numbers) < $per_page)
{
$rand_numbers[] = create_rand_num($total_rows,$rand_numbers);
}

for($i=0;$i<$per_page;$i++)
{
echo($rand_numbers[$i]."<br />");
}

Edited by Burevestnik
Link to comment
Share on other sites

  • 0

не за что :)

Смотрите у вас получается следующее, если числа нет в массиве тогда срабатывает return $r_n, если число есть в массиве то вы вызываете опять функцию create_rand_num, при этом после того как она отработала т.е. нашла новое случайное число она возвращается туда откуда вызвалась а после нее уже нет возврата значения и поэтому у вас получался пустой элемент массива

вот доработанный ваш вариант - думаю разберетесь

$total_rows = 13;
$per_page = 10;
$rand_numbers = array();
function create_rand_num($t_rows,$r_numbers)
{
$r_n = mt_rand(0, $t_rows);
if(!in_array($r_n,$r_numbers))
{
return $r_n;
}
else
{
$r_n = create_rand_num($t_rows,$r_numbers);
return $r_n;
}
}
while (count($rand_numbers) < $per_page)
{
$rand_numbers[] = create_rand_num($total_rows,$rand_numbers);
}

for($i=0;$i<$per_page;$i++)
{
echo($rand_numbers[$i]."<br />");
}

блин точно. забыл это же правило рекурсии. просто на С писал уже сто лет назад и так по накатанному пишу ерунду а потом голову ломаю.

Спасибо большое

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy