Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемешивание 
V
    Опции темы
Сый
Дата 29.3.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Как можно перемешать случайным образом элементы некоторого ряда (массива)?
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
esperant0
Дата 29.3.2006, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Идеально так:

Берешь первый элемент и меняешь его с любым случайно выбранным элементом от первого до последнего

берешь 2-йй элемент и меняешь его с любым случайно выбранным элементом от 2-го до последнего.

и так до конца.


Все.


Вот неправильно решение:
Берешь первый элемент и меняешь его с любым случайно выбранным элементом от 1-го до последнего

берешь 2-йй элемент и меняешь его с любым случайно выбранным элементом от 1-го до последнего.

и так до конца.


удачи друг



--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
maxim1000
Дата 30.3.2006, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



ну, если имеется в виду, чтобы любая комбинация имела одинаковую вероятность, то можно такой алгоритм:
1. на первое место ставим элемент со случайным номером от 1 до N
2. (для удобства) перенумеровываем все остальные элементы от 1 до N-1 (чтобы не было дырки, которая останется от предыдущего элемента)
3. на второе место ставим элемент со случайным номером от1 до N-1
...

ну или тот же алгоритм только с другой стороны:
1. первый элемент ставим на случайное место (от 1 до N)
2. второй на случайное место из оставшихся незанятых (от 1 до N-1)
...


--------------------
qqq
PM WWW   Вверх
esperant0
Дата 30.3.2006, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(maxim1000 @ 30.3.2006, 00:16)
ну, если имеется в виду, чтобы любая комбинация имела одинаковую вероятность, то можно такой алгоритм:
1. на первое место ставим элемент со случайным номером от 1 до N
2. (для удобства) перенумеровываем все остальные элементы от 1 до N-1 (чтобы не было дырки, которая останется от предыдущего элемента)
3. на второе место ставим элемент со случайным номером от1 до N-1
...

ну или тот же алгоритм только с другой стороны:
1. первый элемент ставим на случайное место (от 1 до N)
2. второй на случайное место из оставшихся незанятых (от 1 до N-1)
...

первый алгоритм имеет квадратичную сложность


второй алгоритм надо уточнить.


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
maxim1000
Дата 30.3.2006, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(esperant0 @ 29.3.2006, 23:29 Найти цитируемый пост)
второй алгоритм надо уточнить

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


а с заменами, действительно быстрее получается smile


--------------------
qqq
PM WWW   Вверх
Сый
Дата 30.3.2006, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Решил реализовать "неправильное решение", но переделать в "правильное" при помощи сложения и вычитания труда не составит. А переименовывать элементы, думаю, что будет сложновато.
Код

ОТДЕЛ Мешалка+;

ИСПОЛЬЗУЕТ
  Матем ИЗ "...\Отделы\Числа\",
  Вывод ИЗ "...\Отделы\Обмен\";

ПЕР
  Ряд: РЯД 3 ИЗ ЦЕЛ;

ЗАДАЧА Перемешать();
ПЕР
  ч, б, с: ЦЕЛ;
УКАЗ
  ОТ ч := 0 ДО РАЗМЕР(Ряд)-1 ВЫП
    с := УЗК(ВШИРЦЕЛ(Матем.случ()*(РАЗМЕР(Ряд)-1)));
    б := Ряд[с]; Ряд[с] := Ряд[ч]; Ряд[ч] := б
  КОН;
КОН Перемешать;

УКАЗ
  Ряд[0] := 1; Ряд[1] := 2; Ряд[2] := 3;
  Вывод.ЧЦел("%d, %d, %d^", Ряд[0], Ряд[1], Ряд[2], 0);
  Перемешать;
  Вывод.ЧЦел("%d, %d, %d", Ряд[0], Ряд[1], Ряд[2], 0)

КОН Мешалка.

Результат работы:
D:\Глагол\Приложения\Свои>Мешалка
1, 2, 3
2, 3, 1
D:\Глагол\Приложения\Свои>Мешалка
1, 2, 3
2, 1, 3
D:\Глагол\Приложения\Свои>Мешалка
1, 2, 3
1, 3, 2
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
esperant0
Дата 30.3.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(Сый @ 30.3.2006, 17:55)
Решил реализовать "неправильное решение", но переделать в "правильное" при помощи сложения и вычитания труда не составит. А переименовывать элементы, думаю, что будет сложновато.
Код

ОТДЕЛ Мешалка+;

ИСПОЛЬЗУЕТ
  Матем ИЗ "...\Отделы\Числа\",
  Вывод ИЗ "...\Отделы\Обмен\";

ПЕР
  Ряд: РЯД 3 ИЗ ЦЕЛ;

ЗАДАЧА Перемешать();
ПЕР
  ч, б, с: ЦЕЛ;
УКАЗ
  ОТ ч := 0 ДО РАЗМЕР(Ряд)-1 ВЫП
    с := УЗК(ВШИРЦЕЛ(Матем.случ()*(РАЗМЕР(Ряд)-1)));
    б := Ряд[с]; Ряд[с] := Ряд[ч]; Ряд[ч] := б
  КОН;
КОН Перемешать;

УКАЗ
  Ряд[0] := 1; Ряд[1] := 2; Ряд[2] := 3;
  Вывод.ЧЦел("%d, %d, %d^", Ряд[0], Ряд[1], Ряд[2], 0);
  Перемешать;
  Вывод.ЧЦел("%d, %d, %d", Ряд[0], Ряд[1], Ряд[2], 0)

КОН Мешалка.

Результат работы:
D:\Глагол\Приложения\Свои>Мешалка
1, 2, 3
2, 3, 1
D:\Глагол\Приложения\Свои>Мешалка
1, 2, 3
2, 1, 3
D:\Глагол\Приложения\Свои>Мешалка
1, 2, 3
1, 3, 2

Я не уверен, что вы правильно понимаете почему неправильно, неправильное решение.


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
Сый
Дата 30.3.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Ну так объясните, в чём, по-вашему, заключается его "неправильность"...
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
maxim1000
Дата 30.3.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(esperant0 @ 30.3.2006, 20:32 Найти цитируемый пост)
Я не уверен, что вы правильно понимаете почему неправильно, неправильное решение.

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


--------------------
qqq
PM WWW   Вверх
maxim1000
Дата 30.3.2006, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Хы-хы...
оказалось, вполне достаточно покрутить массив из трех элементов, чтобы увидеть доказательство неправильности "неправильного алгоритма"

количество всевозможных последовательностей обменов n^n и у каждого одинаковая вероятность
каждая последовательность обменов ведет к какому-то порядку следования элементов в массиве (перестановке)
таких перестановок n!
чтобы каждая перестановка имела одинаковую вероятность, нужно чтобы все возможные последовательности равномерно распределились по перестановкам
а вот этого-то как разбыть и не может, т.к. n^n не делится на n!smile
(n=1 или 2 не в счет)

хотя лично для меня это не объясняет так сказать физику процесса - почему и на каком этапе вероятности получаются разными


--------------------
qqq
PM WWW   Вверх
esperant0
Дата 31.3.2006, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(maxim1000 @ 30.3.2006, 22:53)
Хы-хы...
оказалось, вполне достаточно покрутить массив из трех элементов, чтобы увидеть доказательство неправильности "неправильного алгоритма"

количество всевозможных последовательностей обменов n^n и у каждого одинаковая вероятность
каждая последовательность обменов ведет к какому-то порядку следования элементов в массиве (перестановке)
таких перестановок n!
чтобы каждая перестановка имела одинаковую вероятность, нужно чтобы все возможные последовательности равномерно распределились по перестановкам
а вот этого-то как разбыть и не может, т.к. n^n не делится на n!smile
(n=1 или 2 не в счет)

хотя лично для меня это не объясняет так сказать физику процесса - почему и на каком этапе вероятности получаются разными

Интуиция мне тоже не ясна. Но ваше доказательство достаточно.


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
nostromo
Дата 7.4.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



maxim1000
Цитата

а вот этого-то как разбыть и не может, т.к. n^n не делится на n!


А вы не обратили внимание на то, что таким рассуждением легко опровергается также и "правильный" алгоритм? ($n (n+1) /2$ операций)
smile

--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
esperant0
Дата 7.4.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(nostromo @ 7.4.2006, 16:33)
maxim1000
Цитата

а вот этого-то как разбыть и не может, т.к. n^n не делится на n!


А вы не обратили внимание на то, что таким рассуждением легко опровергается также и "правильный" алгоритм? ($n (n+1) /2$ операций)
smile

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



--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
nostromo
Дата 8.4.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



В таком случае для "неправильного" алгоритма на выходе получаются те же n! вариантов.

То, что некоторые варианты могут
быть реализованы различными способами еще ничего не говорит о
неправильности алгоритма. Связь между вероятностями выбора очередного элемента для обмена на конкретном шаге алгоритма и вероятностью появления той или иной перестановки из n элементов по завершению работы алгоритма неочевидна.
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
maxim1000
Дата 8.4.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(nostromo @ 8.4.2006, 10:11 Найти цитируемый пост)
Связь между вероятностями выбора очередного элемента для обмена на конкретном шаге алгоритма и вероятностью появления той или иной перестановки из n элементов по завершению работы алгоритма неочевидна.

1. вероятность каждой конкретной последовательности обменов равна 1/n^n
2. вероятность каждой конечной перестановки равна сумме вероятностей тех последовательностей обменов, которые к ней приводят
3. эта вероятность равна (должна быть равна) 1/n!
4. т.к. вероятности всех последовательностей обменов одинаковая, то 1/n!=k*1/n^n, где k - количество разных последовательностей обменов, приводящих к данной перестановке (целое)...


--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.3003 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.