Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сформировать массив на основе другого по правилу 
:(
    Опции темы
fara
Дата 22.5.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

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



Имеется массив population. Необходимо получить массив pairs, который того же типа что и population, но в нем элементы должны быть расфасованы случайно на основе массива population.

Пример:
population[0] = 1;
population[1] = 5;
population[2] = 153;
population[3] = 12;

Код

pairs = getPairs(population);


pairs[0] = 5;
pairs[1] = 1;
pairs[2] = 153;
pairs[3] = 12;

Ф-ия getPairs вызывается в цикле, поэтому крайне важно чтобы массив pairs отличался от массива pairs на предыдущем шаге цикла.

Спасибо 
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
fara
Дата 22.5.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

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



Цитата

поэтому крайне важно чтобы массив pairs отличался от массива pairs на предыдущем шаге цикла.

я имею в виду как можно чаще отличался 
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
Mechanic
Дата 22.5.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Как расфасованы?
То есть, значения массива 1 полностью повторяются в массиве 2 без изменений, но меняются только индексы (порядок выборки этих элементов)?

Или же, имеется общая популяция, разбросанная по элементам первого массива, и теперь её нужно заново собрать но уже в другом массиве, возможно, с новыми значениями элементов этого массива?
 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
fara
Дата 23.5.2006, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

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



Индексы оставить, а просто раскидать значения случайно. 
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
Rennigth
Дата 23.5.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



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

procedure ShuffleItems(
  var VItems: TDynArray);
var
  i, lTmp: Integer;
  lItem: TDynArray;
begin
  for i := Low(VItems) to High(VItems) do
  begin
    lTmp := Random(High(VItems));
    lItem := VItems[lTmp];
    VItems[lTmp] := VItems[i];
    VItems[i] := lItem;
  end;
end;
 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Dimannn
Дата 23.5.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

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



Rennigth, тут нажен такой Random, который не выдаст второй раз какое-то число, пока не выдаст все числа но одному разу... 


--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
Sunr1se
Дата 23.5.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 6
Всего: 13



Создавай массив и записывай в него те значения, которые уже были сгенерированы, а затем при каждом рандоме проверяй, встречалось ли такое значение. Правда, тогда перемешивание может занять очень много времени. 
--------------------
IRC-канал Винграда 
PM MAIL ICQ   Вверх
Dimannn
Дата 25.5.2006, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

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



Sunr1se, тогда лучше не массив, а множество(set). 


--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
fara
Дата 30.5.2006, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

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



Я это понял, но весь прикол в том что я не знаю как проверить есть ли такой в массиве элемент! smile 
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
ElMichael
Дата 30.5.2006, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.5.2006
Где: г. Благовещенск ( Амур.обл.)

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



Не возражаешь против небольшого уточнения?

Допустим, сейчас i-ая итерация твоего процесса.
Возможно ли совпадение массива population на (i-1) и (i+1) инерации? 
PM MAIL ICQ   Вверх
fara
Дата 30.5.2006, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

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



Я не понял, какого именно процесса? smile

Добавлено @ 08:46 
Если правильно понял, то ты имеешь в виду, уникален ли сам массив population?
Массив population в ходе обработки вообще никак не должен модифицироваться.

Добавлено @ 08:50 
В общем вопрос сводиться к тому, есть ли аналог в дельфе (необятельно просто ф-ия)
ф-ии в PHP
Код

if (isset($array[9])) {
 // 9ый элемент задан
}
 
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
Mechanic
Дата 30.5.2006, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(fara @  30.5.2006,  08:42 Найти цитируемый пост)
В общем вопрос сводиться к тому, есть ли аналог в дельфе (необятельно просто ф-ия)
ф-ии в PHP

код Pascal/Delphi
if (isset($array[9])) {
 // 9ый элемент задан
}
 


Код

if not (a in MySet) then MySet := MySet+[a];
 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
fara
Дата 30.5.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

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



укажите пжл кто такие
a и MySet

т.е. как они задаются в области задания типов, переменных и тп

Добавлено @ 09:44 
Код

function TForm1.selectPairs(population:generation) : generation;
Type
    tmp = Set of byte;
var
  i, j : integer;
  t : real;
begin
  randomize;
  for i := units downto 2 do
  begin
   while true do
   begin
    j := random(i);
    if (not (j in tmp)) then
    begin
      tmp := tmp + [j];
      break
    end;
   end;
   t := population[i-1];
   population[i-1] := population[j];
   population[j] := t;
  end;
  selectPairs := population;
end;
 
Компилятор ругается на if (not (j in tmp)) then:
Цитата

'(' expected but ')' found
 

Это сообщение отредактировал(а) fara - 30.5.2006, 09:46
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
Mechanic
Дата 30.5.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(fara @  30.5.2006,  09:33 Найти цитируемый пост)
tmp = Set of byte;

Ага, именно они самые! smile

Только еще бы
Код

var Tmp: Set of byte;;

Tmp := [];
 

Это сообщение отредактировал(а) Mechanic - 30.5.2006, 09:55
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
fara
Дата 30.5.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

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



Mechanic, 
не понял? smile
помоги пжл! у меня осталось 2 часа чтобы программу дописать 
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
Mechanic
Дата 30.5.2006, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(fara @  30.5.2006,  09:54 Найти цитируемый пост)
помоги пжл! у меня осталось 2 часа чтобы программу дописать

А у меня 3 минуты, чтоб до офиса доехать!  smile  
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
fara
Дата 30.5.2006, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

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



А сколько тебе до офиса ехать? 
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
fara
Дата 30.5.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

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



Mechanic, ой, я оказывается не заметил что ты добавил комментарий к своему ответу... 
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
AriX
Дата 30.5.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если я правильно понял, сделай копию массива, а потом случайным образом выбирай 2 любых элемента и меняй их местами. Повтори n-дцать количество раз. Примерно так
Код

// Делаем копию
for i := 0 to High(Population) do
  Pairs[i] := Population[i];
// Прогоняем 1000 раз обмен элементами
for i := 0 to 1000 do begin
  a := Random(High(Pairs));
  b := Random(High(Pairs));
  Temp := Pairs[a];
  Pairs[a] := Pairs[b];
  Pairs[b] := Temp;
end;
 
PM MAIL   Вверх
fara
Дата 31.5.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

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



Фишка в том, что если какой-либо элемент из массива population уже был выбрат, то в последующих циклах этот элемент выбран быть не может!

Т.е. Ваш пример не подходит.

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

Пример.
Исх. массив:
population[0] = 5;
population[1] = 12;
population[2] = 24;
population[3] = 14;
population[4] = 58;
population[5] = 29;

Массив после обработки:
population[0] = 24;
population[1] = 58;
population[2] = 14;
population[3] = 5;
population[4] = 12;
population[5] = 29;

или такой:
population[0] = 58;
population[1] = 12;
population[2] = 29;
population[3] = 5;
population[4] = 24;
population[5] = 14;

или так:
population[0] = 29;
population[1] = 12;
population[2] = 58;
population[3] = 5;
population[4] = 24;
population[5] = 14;

а может быть и идентичным исходному. 
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
AriX
Дата 31.5.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



fara, 
Мой код это и сделает.
ЗЫ: Хотя, конечно, можно и лучше написать, но если простенько, то попробуй как я написал. 
PM MAIL   Вверх
fara
Дата 31.5.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

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



AriX, да, похоже на то.
Я плохо проанализировал Ваш пример.
Спасибо 
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
AriX
Дата 31.5.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вообще, по-хорошему можно сделать так (не код, а алгоритм):
Код

var
  // Массивы (или другой набор данных), в которых будут хранится индексы элементов:
  // В Indexes1 - индекс элемента массива Source, который будет копироваться в Destination
  // В Indexes2 - индекс элемента массива Destination, в который будет копироваться элемент из Source
  Indexes1, Indexes2: array of Integer;
..
begin
  // Сначала заполняем оба Indexes
  
  repeat
    // Дальше берем рандомайзом индексы
    a := Random(Length(Indexes1));
    b := Random(Length(Indexes2));

    // Потом удаляем их из Indexes т.е. по этим индексам уже будут скопированы элементы

    // Дальше копируем
    Destination[Indexes2[b]] := Source[Indexes1[a]];
  until Length(Indexes1) = 0;  
end;

Надеюсь, понятно объяснил smile 

Это сообщение отредактировал(а) AriX - 31.5.2006, 17:47
PM MAIL   Вверх
fara
Дата 31.5.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

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



Я не знаю как удалять smile
А так алгоритм ясен. 
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

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


 




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


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

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