Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генерация куска случайной перестановки 
:(
    Опции темы
SickFxck
Дата 15.4.2011, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



Кто-нибудь знает эффективный алгоритм генерации не всей перестановки, а заранее указанного "отрезка" массива, содержащего перестановку?

Пример. Есть числа от 1 до 10 и есть какая-то её перестановка (массив чисел):
Код
5 8 1 9 6 4 2 7 3 10

, которая определяется просто каким-то числом (seed для генератора псевдослучайных чисел) в программе. Реально такой массив не собираюсь генерировать, поскольку N может быть очень большим.
Также дан диапазон индексов, который требуется получить из этого массива. К примеру, 5-9, т.е. нужно получить следующие элементы: "4 2 7 3 10", не генерируя все предыдущие, т.к. они мне не нужны.

Очевидно, что обычный алгоритм вроде (псевдокод)
Код

set_random_generator_seed(123);

for(i = 0; i < N; i++)
{
    arr.swap(i, random(i, N - 1));
}

требует генерации всех чисел (от первого элемента до верхней границы диапазона).

Добавлено через 4 минуты и 19 секунд
Я правда с описанием немного намудрил. Если гораздо короче: как получить i-й элемент какой-то определённой перестановки чисел от 1 до N, не генерируя все (или большую часть) остальных элементов перестановки? Сама перестановка определяется каким-то числом.
PM MAIL   Вверх
миг
Дата 16.4.2011, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 1



Я бы сделал так. чтобы найти случайное число на отрезке от i до k. Нужно с генерировать  любое случайное число(думаю ваш компилятор умеет это делать). Найти остаток от деления на число k. Затем проверить условие, чтобы число i было меньше или равно остатку от деления. 

Это сообщение отредактировал(а) миг - 16.4.2011, 08:02
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
SickFxck
Дата 16.4.2011, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



миг, вы о чём вообще?
PM MAIL   Вверх
_Y_
Дата 16.4.2011, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(SickFxck @  15.4.2011,  20:33 Найти цитируемый пост)
Если гораздо короче: как получить i-й элемент какой-то определённой перестановки чисел от 1 до N, не генерируя все (или большую часть) остальных элементов перестановки?

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

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


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
SickFxck
Дата 16.4.2011, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



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

maxim1000

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


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

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


 




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


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

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