Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> Проверка массива случайных цифр на совпадения
Lawyer  
 ۩  [x]    Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



free
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 86
Пользователь №: 21133
На форуме: 7 лет, 2 месяца, 24 дня
Карма: 2




Доброго времени суток, прошу помочь со следующим кодом
код


<?php

//заголовок
header("Content-Type: text/html; charset=utf-8");

//присваиваем массиву значения
for ($i=0; $i<7; $i++)
{
$rand[$i]=rand(1,52);
}

//проверяем 50 раз что бы исключить повторы
for ($i=0; $i<50; $i++)
{
//проверяем $rand[0] на совпадения
if ($rand[0]==$rand[1])
{
$rand[0]=rand(1,52);
}
else
{
if ($rand[0]==$rand[2])
{
$rand[0]=rand(1,52);
}
else
{
if ($rand[0]==$rand[3])
{
$rand[0]=rand(1,52);
}
else
{
if ($rand[0]==$rand[4])
{
$rand[0]=rand(1,52);
}
else
{
if ($rand[0]==$rand[5])
{
$rand[0]=rand(1,52);
}
else
{
if ($rand[0]==$rand[6])
{
$rand[0]=rand(1,52);
}
}
}
}
}
}


//проверяем $rand[1] на совпадения
if ($rand[1]==$rand[0])
{
$rand[1]=rand(1,52);
}
else
{
if ($rand[1]==$rand[2])
{
$rand[1]=rand(1,52);
}
else
{
if ($rand[1]==$rand[3])
{
$rand[1]=rand(1,52);
}
else
{
if ($rand[1]==$rand[4])
{
$rand[1]=rand(1,52);
}
else
{
if ($rand[1]==$rand[5])
{
$rand[1]=rand(1,52);
}
else
{
if ($rand[1]==$rand[6])
{
$rand[1]=rand(1,52);
}
}
}
}
}
}


//проверяем $rand[2] на совпадения
if ($rand[2]==$rand[0])
{
$rand[2]=rand(1,52);
}
else
{
if ($rand[2]==$rand[1])
{
$rand[2]=rand(1,52);
}
else
{
if ($rand[2]==$rand[3])
{
$rand[2]=rand(1,52);
}
else
{
if ($rand[2]==$rand[4])
{
$rand[2]=rand(1,52);
}
else
{
if ($rand[2]==$rand[5])
{
$rand[2]=rand(1,52);
}
else
{
if ($rand[2]==$rand[6])
{
$rand[2]=rand(1,52);
}
}
}
}
}
}


//проверяем $rand[3] на совпадения
if ($rand[3]==$rand[0])
{
$rand[3]=rand(1,52);
}
else
{
if ($rand[3]==$rand[1])
{
$rand[3]=rand(1,52);
}
else
{
if ($rand[3]==$rand[2])
{
$rand[3]=rand(1,52);
}
else
{
if ($rand[3]==$rand[4])
{
$rand[3]=rand(1,52);
}
else
{
if ($rand[3]==$rand[5])
{
$rand[3]=rand(1,52);
}
else
{
if ($rand[3]==$rand[6])
{
$rand[3]=rand(1,52);
}
}
}
}
}
}


//проверяем $rand[4] на совпадения
if ($rand[4]==$rand[0])
{
$rand[4]=rand(1,52);
}
else
{
if ($rand[4]==$rand[1])
{
$rand[4]=rand(1,52);
}
else
{
if ($rand[4]==$rand[2])
{
$rand[4]=rand(1,52);
}
else
{
if ($rand[4]==$rand[3])
{
$rand[4]=rand(1,52);
}
else
{
if ($rand[4]==$rand[5])
{
$rand[4]=rand(1,52);
}
else
{
if ($rand[4]==$rand[6])
{
$rand[4]=rand(1,52);
}
}
}
}
}
}


//проверяем $rand[5] на совпадения
if ($rand[5]==$rand[0])
{
$rand[5]=rand(1,52);
}
else
{
if ($rand[5]==$rand[1])
{
$rand[5]=rand(1,52);
}
else
{
if ($rand[5]==$rand[2])
{
$rand[5]=rand(1,52);
}
else
{
if ($rand[5]==$rand[3])
{
$rand[5]=rand(1,52);
}
else
{
if ($rand[5]==$rand[4])
{
$rand[5]=rand(1,52);
}
else
{
if ($rand[5]==$rand[6])
{
$rand[5]=rand(1,52);
}
}
}
}
}
}


//проверяем $rand[6] на совпадения
if ($rand[6]==$rand[0])
{
$rand[6]=rand(1,52);
}
else
{
if ($rand[6]==$rand[1])
{
$rand[6]=rand(1,52);
}
else
{
if ($rand[6]==$rand[2])
{
$rand[6]=rand(1,52);
}
else
{
if ($rand[6]==$rand[3])
{
$rand[6]=rand(1,52);
}
else
{
if ($rand[6]==$rand[4])
{
$rand[6]=rand(1,52);
}
else
{
if ($rand[6]==$rand[5])
{
$rand[6]=rand(1,52);
}
}
}
}
}
}
}


echo "Генератор \"не повторяющихся цифр от 1 до 52\"<br>";

//выводим массив
for ($i=0; $i<7; $i++)
{
echo "<br>".$rand[$i]."<br>";
}


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



Спустя 3 минуты, 37 секунд (7.02.2012 - 16:39) Winston написал(а):
О май Год wacko.gif

Спустя 1 минута, 2 секунды (7.02.2012 - 16:40) Lawyer написал(а):
сам в шоке

Спустя 13 секунд (7.02.2012 - 16:40) Winston написал(а):
Так, а что должен делать скрипт, а то лень вникать в твой код?

Спустя 40 секунд (7.02.2012 - 16:41) inpost написал(а):
А почему ты уверен, что последняя сработавшая строчка: $rand[6]=rand(1,52); не создаст повторения с $rand[0] в итоге?
Скрипт обречён на провал.
Внутри foreach надо поставить цикл do-while, а проверять с помощью in_array() каждое новое созданное число. Если дубль, то повторять процедуру.

Спустя 2 минуты, 23 секунды (7.02.2012 - 16:43) Lawyer написал(а):
генерировать массив с 7 значениями от 1 до 52 и фильтровать (заменять) повторяющиеся элементы массива на новые до тех пор пока каждый элемент не будет индивидуален (не перестанет повторяться), но не более 50 раз, думаю больше и не нужно будет)

Спустя 1 минута (7.02.2012 - 16:44) Lawyer написал(а):
inpost, так что бы не совпала там стоит цикл на повторение проверки

Спустя 2 минуты, 22 секунды (7.02.2012 - 16:46) nugle написал(а):
попробуй так
$allDigits2 = array();

for($i=0; $i<50; $i++)
{
$size1 = sizeof($allDigits2);
$size2 = sizeof($allDigits2);

while($size2 != $size1 + 1)
{
$n = rand(1,52);
if(!in_array($n, $allDigits2))
$allDigits2[] = $n;
else
$n = rand(1,8);
$size2 = sizeof($allDigits2);
}
}

Спустя 10 минут, 54 секунды (7.02.2012 - 16:57) Invis1ble написал(а):
$data = array();
$range = range(1, 52);
for ($i = 0; $i < 7; ++ $i)
{
$rand = array_rand($range);
$data[] = $range[$rand];
unset($range[$rand]);
}

Спустя 33 минуты, 1 секунда (7.02.2012 - 17:30) Lawyer написал(а):
Invis1ble
Спасибо, данное решение оптимально подходит под поставленную задачу, премного благодарен. user posted image
nugle
Спасибо за предложенный вариант решения проблемы

Спустя 47 минут, 59 секунд (7.02.2012 - 18:18) Invis1ble написал(а):
Еще более короткий вариант:
$data = array_rand(array_reverse(range(1, 52)), 7);
// shuffle($data); // если нужна "неупорядоченность"

Спустя 23 минуты, 9 секунд (7.02.2012 - 18:41) Lawyer написал(а):
если выводить так

$data = array_rand(array_reverse(range(1, 52)), 7);
// если нужна "неупорядоченность"
// shuffle($data);

for ($i=0; $i<7; $i++)
{
echo "<br>".$data[$i];
}

по непонятным мне причинам иногда выдает в одном из значений "0", а этого не надо =)
а если так

$data = array_rand(array_reverse(range(1, 52)), 8);
// если нужна "неупорядоченность"
// shuffle($data);

for ($i=1; $i<8; $i++)
{
echo "<br>".$data[$i];
}

то в принципе норм, но первый вариант как-то более понятен, лучше уж использовать то что понимаешь) спасибо еще раз )

Спустя 4 минуты, 59 секунд (7.02.2012 - 18:46) Invis1ble написал(а):
А, ну да. Думал array_reverse() избавиться от нулевого индекса, но забыл, что array_rand() все равно ключи возвращает.
Так можно исправить:
$data = array_rand(array_combine(range(1, 52), range(1, 52)), 7);

Но если ты все равно юзаешь цикл, то первый вариант оптимальней.

Спустя 4 минуты, 12 секунд (7.02.2012 - 18:51) Lawyer написал(а):
Ну да, так все ок smile.gif спасибо)
Цикл только для проверки, писать меньше)
В будущем выводить значение придется вероятнее всего ключами по отдельности

Спустя 4 минуты, 28 секунд (7.02.2012 - 18:55) Invis1ble написал(а):
Версия 2.0:
$data = array_rand(array_fill_keys(range(1, 52), null), 7);

:D

Спустя 43 секунды (7.02.2012 - 18:56) inpost написал(а):
Invis1ble
Вот так и хочется побольше слов "молодец" получить, да?! smile.gif

Спустя 2 минуты, 7 секунд (7.02.2012 - 18:58) Invis1ble написал(а):
Нет, просто недавно была подобная задача у меня. Решаю как бы не только для ТС smile.gif
Да, и еще - кто-то уже писал, что я маньяк оптимизации

Спустя 6 минут, 45 секунд (7.02.2012 - 19:05) Lawyer написал(а):
тут по длине если мой изначальный код сравнить с тем до чего дошли в итоге... даже сравнивать не хочется smile.gif
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Закрытая темаСоздание новой темыСоздание опроса