код
<?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 написал(а):
О май Год

Спустя 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() каждое новое созданное число. Если дубль, то повторять процедуру.
Скрипт обречён на провал.
Внутри 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
Спасибо, данное решение оптимально подходит под поставленную задачу, премного благодарен.
nugle
Спасибо за предложенный вариант решения проблемы
Спасибо, данное решение оптимально подходит под поставленную задачу, премного благодарен.

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 написал(а):
если выводить так
по непонятным мне причинам иногда выдает в одном из значений "0", а этого не надо =)
а если так
то в принципе норм, но первый вариант как-то более понятен, лучше уж использовать то что понимаешь) спасибо еще раз )
$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 написал(а):
Ну да, так все ок
спасибо)
Цикл только для проверки, писать меньше)
В будущем выводить значение придется вероятнее всего ключами по отдельности

Цикл только для проверки, писать меньше)
В будущем выводить значение придется вероятнее всего ключами по отдельности
Спустя 4 минуты, 28 секунд (7.02.2012 - 18:55) Invis1ble написал(а):
Версия 2.0:
:D
$data = array_rand(array_fill_keys(range(1, 52), null), 7);
:D
Спустя 43 секунды (7.02.2012 - 18:56) inpost написал(а):
Invis1ble
Вот так и хочется побольше слов "молодец" получить, да?!
Вот так и хочется побольше слов "молодец" получить, да?!

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

Да, и еще - кто-то уже писал, что я маньяк оптимизации
Спустя 6 минут, 45 секунд (7.02.2012 - 19:05) Lawyer написал(а):
тут по длине если мой изначальный код сравнить с тем до чего дошли в итоге... даже сравнивать не хочется
