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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2023, 01:23   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Перемешать строки

Задача - перемещать строки
Вопрос: есть ли лучше алгоритм? Может, более прямой

Код:
Procedure RandomList(ss_In, ss_Out:TStrings);
var
  i, j:integer;
begin
  ss_Out.Clear;
  j:=ss_in.Count;
  If j=0 then exit;

  dec(j);
  ss_out.Add(ss_in[j]);

  while j>0 do begin
    i:=Random(ss_out.Count+1);
    dec(j);
    If i=0 then begin
      ss_out.Add(ss_in[j]);
    end else begin
      dec(i);
      ss_out.Insert(i, ss_in[j]);
    end;

  end;
end;
Kronos913 вне форума Ответить с цитированием
Старый 10.11.2023, 02:49   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Отсюда:
Код:
procedure Shuffle(Strings: TStrings);
var
  i: Integer;
begin
  for i := Strings.Count - 1 downto 1 do 
    Strings.Exchange(i, Random(i + 1));
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 11.11.2023, 00:31   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

А цикл For не выдаст ошибку если зайдёт лист на 0 или 1 строку?
Kronos913 вне форума Ответить с цитированием
Старый 11.11.2023, 01:08   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Ошибок не будет, тело цикла просто ни разу не выполнится.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 11.11.2023, 01:08   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
А цикл For не выдаст ошибку
Сам по себе цикл For ошибок не выдает никогда.
northener вне форума Ответить с цитированием
Старый 11.11.2023, 01:50   #6
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

То есть, получается нет необходимости строить "защиту", делая цикл через while и изменением счётчика внутри цикла?
Код:
i:=Strings.Count;
while i>1 do begin
  dec(i);
  Strings.Exchange(i, Random(i + 1));
end;
Kronos913 вне форума Ответить с цитированием
Старый 11.11.2023, 02:08   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
То есть, получается нет необходимости строить "защиту", делая цикл через while и изменением счётчика внутри цикла?
Нет.
northener вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перемешать слайды PowerPoint pacha.i Microsoft Office Word 0 06.10.2020 19:39
Перемешать строки в Listbox chiko666111 Общие вопросы Delphi 3 08.09.2015 10:09
Делфи, перемешать строки stringgrid Tony. Помощь студентам 2 19.06.2012 14:19
перемешать listbox nevru1bphp Общие вопросы Delphi 2 15.10.2010 09:20
Как быстро перемешать строки? zver777 Общие вопросы Delphi 5 23.08.2009 20:50