Форум Фотогалерея Деловой мир Мелитополя
Мелитополь
Мелитопольский форум
 
 RSS  FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Я иногда "прокручиваю" в голове...
На страницу 1, 2  След.
 
Начать новую тему   Ответить на тему    Список форумов Мелитополь -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Serg_HD

Активист


Пол: Пол: Он
Зарегистрирован: 22.12.2004
Сообщения: 999
Откуда: Киев
Репутация: 251.6
голосов: 13

СообщениеДобавлено: Вт Янв 23, 2007 19:16 pm    Заголовок сообщения: Я иногда "прокручиваю" в голове... Ответить с цитатой

Не знаю как другие, но у меня такое бывает - когда делать нечего начинаю проворачивать в голове какие-нить алгоритмы. Вот, например, как этот:
Код:

function rand_mas()
{
$k=array (5);
$k[0]=rand(1,5);
for ($i=1;$i<5;$i++)
{
$k[$i]=rand(1,5);
for ($m=0;$m<$i;$m++)
if ($k[$i]==$k[$m])
while ($k[$i]==$k[$m]) {$k[$i]=rand(1,5);}
}
for ($i=0;$i<5;$i++) echo "$k[$i]<br>";
}
rand_mas();

Как вы поняли, это простенький алгоритм создания одномерного массива неповторяющихся чисел ("размышлять" о двух- и более мерном без записей уже как-то не так интересно). Так вот. Тут есть маленькая ошибка, но из-за неё массив будет с повторами. Кто нашёл какая? Smile . Предлагайте также свои небольшие алгоритмы, всем ведь интересно будет Rolling Eyes
Вернуться к началу
Посмотреть профиль Отправить личное сообщение   AIM Address
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Вт Янв 23, 2007 19:35 pm    Заголовок сообщения: Ответить с цитатой

Код:
function rand_mas()
{
  $k=array();
  $tmp=0;
  for ($i=0;$i<5;$i++){
    $tmp=rand(1,5);
    while (in_array($tmp,$k)){
      $tmp=rand(1,5);
    }
    $k[$i]=$tmp;
  }
  var_dump($k);
}
rand_mas();

Точно то же только проще
Цитата:
$k=array (5);

Зачем первым элементом делать 5 ?
Язык PHP я так понял.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
Serg_HD

Активист


Пол: Пол: Он
Зарегистрирован: 22.12.2004
Сообщения: 999
Откуда: Киев
Репутация: 251.6
голосов: 13

СообщениеДобавлено: Вт Янв 23, 2007 19:37 pm    Заголовок сообщения: Ответить с цитатой

Это не первый элемент равен 5-ти, а массив состоит из пяти элементов, но можно было его конечно не указывать
Вернуться к началу
Посмотреть профиль Отправить личное сообщение   AIM Address
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Вт Янв 23, 2007 19:41 pm    Заголовок сообщения: Ответить с цитатой

Serg_HD писал(а):
Это не первый элемент равен 5-ти, а массив состоит из пяти элементов, но можно было его конечно не указывать

Код:
$k=array(5);
var_dump($k);


Вывод
array(1) {
[0]=>
int(5)
}
Ты ошибаешся в PHP нет размерности массива
Читай доку
http://www.php.net/function.array
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
Serg_HD

Активист


Пол: Пол: Он
Зарегистрирован: 22.12.2004
Сообщения: 999
Откуда: Киев
Репутация: 251.6
голосов: 13

СообщениеДобавлено: Вт Янв 23, 2007 19:46 pm    Заголовок сообщения: Ответить с цитатой

Да какая разница, не в том дело. Я специально не писал никаких левых функций, чтоб даже тем, кто не знает пхп было понятно о чём речь, т.к. говорю именно об алгоритме. А так можно было бы тупо использовать тот же shuffle() хотя бы. Так ты нашёл в чём там ошибка? Smile

Последний раз редактировалось: Serg_HD (Вт Янв 23, 2007 20:56 pm), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение   AIM Address
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Вт Янв 23, 2007 19:48 pm    Заголовок сообщения: Ответить с цитатой

Чтобы было понятно тогда предлагаю выровнять код
Код:
function rand_mas()
{
  $k=array (5);
  $k[0]=rand(1,5);
  for ($i=1;$i<5;$i++)
  {
    $k[$i]=rand(1,5);
    for ($m=0;$m<$i;$m++){
      if ($k[$i]==$k[$m]){
        while ($k[$i]==$k[$m]) {
          $k[$i]=rand(1,5);
        }
      }
    }
  }
  for ($i=0;$i<5;$i++) echo "$k[$i]<br>";
}
rand_mas();
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
Serg_HD

Активист


Пол: Пол: Он
Зарегистрирован: 22.12.2004
Сообщения: 999
Откуда: Киев
Репутация: 251.6
голосов: 13

СообщениеДобавлено: Вт Янв 23, 2007 19:50 pm    Заголовок сообщения: Ответить с цитатой

у тебя есть чувство юмора однако Very Happy Very Happy
Вернуться к началу
Посмотреть профиль Отправить личное сообщение   AIM Address
Serg_HD

Активист


Пол: Пол: Он
Зарегистрирован: 22.12.2004
Сообщения: 999
Откуда: Киев
Репутация: 251.6
голосов: 13

СообщениеДобавлено: Вт Янв 23, 2007 19:57 pm    Заголовок сообщения: Ответить с цитатой

Ладно, сам не люблю када от меня чего-то хотят, поэтому ограничусь лишь предложением. Ошибка была тут:
Код:

function rand_mas()
{
$k=array ();
$k[0]=rand(1,5);
for ($i=1;$i<5;$i++)
{
$k[$i]=rand(1,5);
for ($m=0;$m<$i;$m++)
if ($k[$i]==$k[$m])
while ($k[$i]==$k[$m]) {$k[$i]=rand(1,5);$m=0;}//добавлено $m=0; для обнуления цикла
}
for ($i=0;$i<5;$i++) echo "$k[$i]<br>";
}
rand_mas();
Вернуться к началу
Посмотреть профиль Отправить личное сообщение   AIM Address
Радион

Писатель


Пол: Пол: Оно
Зарегистрирован: 04.11.2006
Сообщения: 269
Откуда: Кислодрыщенск
Репутация: 20.4

СообщениеДобавлено: Вт Янв 23, 2007 22:30 pm    Заголовок сообщения: Ответить с цитатой

сори, без обид ))))
но че-то фраза вспомнилась: сам шучу, сам смеюсь ))))

Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение  
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Ср Янв 24, 2007 10:36 am    Заголовок сообщения: Ответить с цитатой

Serg_HD писал(а):
Ладно, сам не люблю када от меня чего-то хотят, поэтому ограничусь лишь предложением. Ошибка была тут:
Код:

function rand_mas()
{
$k=array ();
$k[0]=rand(1,5);
for ($i=1;$i<5;$i++)
{
$k[$i]=rand(1,5);
for ($m=0;$m<$i;$m++)
if ($k[$i]==$k[$m])
while ($k[$i]==$k[$m]) {$k[$i]=rand(1,5);$m=0;}//добавлено $m=0; для обнуления цикла
}
for ($i=0;$i<5;$i++) echo "$k[$i]<br>";
}
rand_mas();

В изначально корявом алгоритме ошибки лучше не искать, а переписать заново. У меня получилось проще и логичней Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
Serg_HD

Активист


Пол: Пол: Он
Зарегистрирован: 22.12.2004
Сообщения: 999
Откуда: Киев
Репутация: 251.6
голосов: 13

СообщениеДобавлено: Ср Янв 24, 2007 15:06 pm    Заголовок сообщения: Ответить с цитатой

жалко что не нашли(array (5) на сам алгоритм не влияет, только в некоторой степени, как выяснилось, на "случайность" [0]-го элемента) Laughing

Последний раз редактировалось: Serg_HD (Ср Янв 24, 2007 15:43 pm), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение   AIM Address
Serg_HD

Активист


Пол: Пол: Он
Зарегистрирован: 22.12.2004
Сообщения: 999
Откуда: Киев
Репутация: 251.6
голосов: 13

СообщениеДобавлено: Ср Янв 24, 2007 15:13 pm    Заголовок сообщения: Ответить с цитатой

Thomas писал(а):

В изначально корявом алгоритме ошибки лучше не искать, а переписать заново. У меня получилось проще и логичней Wink

И непонятно для тех, кто не знаком с пхп-шными ф-ями Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение   AIM Address
Varvar

Писатель


Пол: Пол: Он
Зарегистрирован: 02.11.2006
Сообщения: 400

Репутация: 51.9
голосов: 8

СообщениеДобавлено: Ср Янв 24, 2007 16:04 pm    Заголовок сообщения: Ответить с цитатой

2Serg_HD Да я вообще не понимаю почему ты описывал алгоритм на РНР. Обычно все алгоритмы описывают либо на Паскале, либо на Си. Я не считаю удачным показывать алгоритм на РНР.
Соглашусь с Томасом, что приведенный код надо оформлять правильно с отступами и нормальными названиями переменных.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
Serg_HD

Активист


Пол: Пол: Он
Зарегистрирован: 22.12.2004
Сообщения: 999
Откуда: Киев
Репутация: 251.6
голосов: 13

СообщениеДобавлено: Ср Янв 24, 2007 18:25 pm    Заголовок сообщения: Ответить с цитатой

Нндасс, прям ядерный алгоритм, очень легко запутаться в переменных конечно, учту на след. раз...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение   AIM Address
Nakilon

Бомж


Пол: Пол: Оно
Зарегистрирован: 09.05.2007
Сообщения: 4

Репутация: 1.3

СообщениеДобавлено: Вс Июн 17, 2007 18:42 pm    Заголовок сообщения: Ответить с цитатой

Предлагаю свой вариант (когда-то делал на С++ одногруппнику по просьбе), - по-моему так будет несколько быстрей, если я правильно понял, как работают ваши вышеописанные алгоритмы:
Код:
void Fill(int *b, int n) {
  int i,j,t,*a=new int[n];
  for (i=n; i--; )
    a[i]=i+1;
  for (i=n,j=0; i>1; )
    b[j++]=a[t=random(i)],
    a[t]=a[--i];
  b[n-1]=a[0];
  delete(a);
; }
Вернуться к началу
Посмотреть профиль Отправить личное сообщение  
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Мелитополь -> Программирование Часовой пояс: GMT + 2
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB

Р: 523906

База отдыха «Белый парус» пгт Кирилловка Азовское море.

Рейтинг Мелитопольских сайтов на Melitopol.org Hosting by VivaNET