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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как можно перемешать элементы одномерн. массива? Есть ли станддартная процедура 
V
    Опции темы
hedge_hog
Дата 22.6.2007, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте. Знает ли кто есть ли процедура или функция которая переставляет в хаотичном порядке элементы массиа. Или самому нужно алгоритм соченять.
PM MAIL   Вверх
Alexeis
Дата 22.6.2007, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Не слышал про такое. Думаю просто Random() и в цикле переставлять.

Добавлено через 1 минуту и 25 секунд
Лучше даже пройтись по всем индексам от 1го до последнего, а рэндомом генерить индекс элемента с которым нужно будет обменять текущим. Т.о. поменяют позицию все элементы.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 22.6.2007, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Alexeis @  22.6.2007,  09:38 Найти цитируемый пост)
Лучше даже пройтись по всем индексам от 1го до последнего, а рэндомом генерить индекс элемента с которым нужно будет обменять текущим. Т.о. поменяют позицию все элементы. 


согласен, сам такое юзал, хотя может и можно придумать что-нибудь более оригинальное.
Код

procedure ShuffleDynIntArray(var VDynArray: TDynIntegerArray);
var
  i, lTmp: Integer;
  lItem: Integer;
begin
  for i := Low(VDynArray) to High(VDynArray) do
  begin
    lTmp := Random(High(VDynArray));
    lItem := VDynArray[lTmp];
    VDynArray[lTmp] := VDynArray[i];
    VDynArray[i] := lItem;
  end;
end;





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


Шустрый
*


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

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



Alexeis, Rennigth, Огромное СпасиБо.
PM MAIL   Вверх
Alexeis
Дата 22.6.2007, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Rennigth, раз  for i := Low(VDynArray)  тогда уже 
Код

procedure ShuffleDynIntArray(var VDynArray: TDynIntegerArray);
var
  i, lTmp: Integer;
  lItem: Integer;
begin
  for i := Low(VDynArray) to High(VDynArray) do
  begin
    lTmp := Low(VDynArray) + Random(High(VDynArray) - Low(VDynArray) + 1);
    lItem := VDynArray[lTmp];
    VDynArray[lTmp] := VDynArray[i];
    VDynArray[i] := lItem;
  end;
end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 22.6.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Alexeis, а зачем +1? Вылетишь же за пределы массива...

Добавлено через 11 минут и 43 секунды
Alexeis, забыл что Random 
Цитата

0 <= X < Range

:(

Тогда так: 
Код

procedure ShuffleDynIntArray(var VDynArray: TDynArrayInteger);
var
  i, lTmp: Integer;
  lItem: Integer;
begin
  for i := Low(VDynArray) to High(VDynArray) do
  begin
    lTmp := Random(High(VDynArray) + 1);
    lItem := VDynArray[lTmp];
    VDynArray[lTmp] := VDynArray[i];
    VDynArray[i] := lItem;
  end;
end;


Зачем лишние вычисления Low?


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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Rennigth @  22.6.2007,  10:55 Найти цитируемый пост)
Зачем лишние вычисления Low? 

Вот именно! И я об этом smile зачем нужно
Код

   for i := Low(VDynArray) to ...

?
когда все динамические массивы и открытые начинаются с "0". Получается непоследовательно, раз используется  Low(VDynArray), значит начало может быть не нулем, а раз начало не ноль, то Random легко может вернуть ноль, что будет за пределами массива и вызовет ошибку. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 22.6.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Просто считаю хорошей привычкой использовать и для дин.массивов и для стат.массивов использование одной конструкции Low/High. Хоть и пишут:
Цитата

Dynamic arrays are always integer-indexed, always starting from 0.

Но вот так мне кажется менее наглядно:
Код

for i := 0 to High(VDynArray) do

Просрачность кода увеличивается. Хотя каждому свое.


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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Rennigth @  22.6.2007,  12:29 Найти цитируемый пост)
Просто считаю хорошей привычкой использовать и для дин.массивов и для стат.массивов использование одной конструкции Low/High. Хоть и пишут:

  Вооот, очень хорошо, тогда почему же в 
Код

lTmp := Random(High(VDynArray) + 1);
    lItem := VDynArray[lTmp];
    VDynArray[lTmp] := VDynArray[i];
    VDynArray[i] := lItem;


индексы массивов неожиданно начали начинаться с нуля, раз предполагается безболезненно переносить на статические? Будешь помнить, что делал универсальную функцию, откопипастишь, а оно начнет глючить и писать в чужую память.

Либо универсально, либо уникально. Уникально-универсальные процедуры главный кандидат на трудноуловимые ошибки. Вроде уверен, что все делал универсально, а не работает  smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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