Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2016, 14:57   #1
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
Стрелка Псевдослучайное перемешивание элементов

Доброго времени суток!

Есть N элементов массива, нужен алгоритм "псевдослучайного перемешивания" этого массива, зависящий от некоторой переменной, с условием, что если клонировать изначальный отсортированный массив и сохраненную переменную, новый перемешанный массив будет идентичен старому.

Живой пример. Есть музыка ВКонтакте и кнопка "перемешать". Когда мы музыку перемешиваем (каждый раз по разному) у нас сохраняется уникальный (до обновления страницы) порядок перемешанных треков. Вот это перемешивание и нужно сохранить не прибегая к перечислению всех элементов с их новыми позициями.

Реализацию писать не нужно, мне нужна сама идея алгоритма, или может дать информацию о уже готовом таком алгоритме. Получается некий shuffle hash.
Так-же не откажусь от информации по гуглению таких вопросов

Спасибо за ваши ответы!
Lime вне форума Ответить с цитированием
Старый 02.04.2016, 15:25   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Код:
for i:=0 to N-1 do
  swap(random(N), random(N));
Зависит от переменной Randseed.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 02.04.2016, 15:27   #3
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Зависит от переменной Randseed.
А если не привязываться к языку и компилятору?
Выходит достаточно использовать открытую реализацию псевдослучайного генератора и просто инициализировать разными значениями?

Спасибо за идею!

Так-же буду рад услышать другие варианты
Lime вне форума Ответить с цитированием
Старый 02.04.2016, 15:36   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
А если не привязываться к языку и компилятору?
Выходит достаточно использовать открытую реализацию псевдослучайного генератора и просто инициализировать разными значениями?
Так точно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 02.04.2016, 17:03   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Только чтобы все варианты были равновероятны, менять i-й элемент надо с элементом не из 0..n-1, а из i..n-1.
Somebody вне форума Ответить с цитированием
Старый 02.04.2016, 17:22   #6
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Только чтобы все варианты были равновероятны, менять i-й элемент надо с элементом не из 0..n-1, а из i..n-1.
А тут уже вопрос самого алгоритма перемешивания
Но в контексте темы он должен быть либо с встроенной псевдо-рандомизацией либо опираться на гпсч, а этот (второй) вариант уже подсказали
Lime вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемешивание алфавита novicepro Общие вопросы Delphi 7 05.10.2013 18:06
Случайное перемешивание Opex911 Помощь студентам 21 26.09.2011 01:15
псевдослучайное число из промежутка [-n;n) turtles Общие вопросы по Java, Java SE, Kotlin 4 23.08.2011 15:22
Перемешивание массива revaldo666 Общие вопросы C/C++ 6 19.01.2011 15:04
Перемешивание строк Черничный БД в Delphi 3 15.07.2008 14:11