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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2011, 20:29   #1
paravoz1k
Пользователь
 
Аватар для paravoz1k
 
Регистрация: 26.03.2010
Сообщений: 78
По умолчанию tstringlist - перемешать строчки

Как в tstringlist перемешать строчки? есть ли функция как в php(перемешивание элементов массива)?
Начинающий кодер Delphi + PHP
paravoz1k вне форума Ответить с цитированием
Старый 17.08.2011, 20:33   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

TStringList не массив.

а так можете ручками взять и написать такую функцию.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.08.2011, 21:15   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Tstrings Exchange & random
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 17.08.2011, 22:16   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

дополню ответы коллег примером кода.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var TS  : TStringList;
   i, k, N : integer;
begin
 TS := TStringList.Create;
 {для тестирования заполним TS числами от 1 до 20}
 for i:=1 to 20 do TS.Append(IntToStr(i));

 {вот, собственно код перемешивания}

 Randomize; // иницилизируем ГСЧ

 N := TS.Count;
 //----------перемешать-------------
 for i:=1 to N-1 do
  begin
   k:= Random(N-i+1)+i;
   if k<>i then TS.Exchange(i-1,k-1);
  end;


 //-------------вывести результат-------------
 Memo1.Lines.Text :=  TS.Text;
end;

p.s. случайное распределение будет нормальное, т.к. в алгоритме учтены поправки отсюда Как не надо тасовать карты
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.08.2011, 23:33   #5
paravoz1k
Пользователь
 
Аватар для paravoz1k
 
Регистрация: 26.03.2010
Сообщений: 78
По умолчанию

Cергей, спасибо вам большое, но я написал свою функцию
Цитата:
procedure Meshaem(f:tstringlist);
var
i:integer;
begin
for i:=0 to 100 do
begin
f.Exchange(random(f.Count),random(f .Count));
end;
end;
Можете посмотреть, разве чем вариант плох?
Начинающий кодер Delphi + PHP
paravoz1k вне форума Ответить с цитированием
Старый 18.08.2011, 00:11   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ваш вариант ОЧЕНЬ плох..

1) откуда взялось число 100 ?! почему не 10 или не 500 или не 10000 ?

2) чем больше записей будет в исходном TStringList, тем больше записей вообще останутся "нетронутыми" (ну, очевидно, что если у Вас будет больше 200 строчек, то даже в самом оптимальном случае ГАРАНТИРОВАННО будут те строчки, которые не попададут в "переплёт", т.е. не будут ни с кем обмены)
Заполните, например, ваш TStringGrid числами от 1 до 1000
перемешайте и выведите результат в Memo
Вы будете потрясены. Целые блоки (последовательности) исходных чисел будут стоять на своих первоначальных местах.

3) В Вашем коде о каком-то равномерномерном-неравномерном распределении говорить вообще не приходится!
Для большего понимания о чём идёт речь, рекомендую ознакомится вот с этой темой на форуме:
В хаотическом порядке получить числа 1-100
ну и не помешает сходить по ссылке, которую я уже приводил
"Как не надо тасовать карты"

4) надеюсь, Вы не забыли в своей программе вызвать
Randomize;
?!
Это очень Важно!
Но вполне достаточно сделать вызов один раз. Например, на событии создания формы OnCreate

5) а чем мой вариант не устроил?
вроде простой, надежный и быстрый...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перемешать listbox nevru1bphp Общие вопросы Delphi 2 15.10.2010 09:20
скрыть строчки peq Microsoft Office Excel 2 23.11.2009 20:15
Как быстро перемешать строки? zver777 Общие вопросы Delphi 5 23.08.2009 20:50
MySql - перемешать варианты в базе Shadow_Wind PHP 9 17.10.2008 09:55
сравнить 2 строчки oLMeR Общие вопросы Delphi 3 02.11.2007 11:51