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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2012, 19:43   #1
glebast
Форумчанин
 
Аватар для glebast
 
Регистрация: 10.12.2011
Сообщений: 154
Восклицание random - строки

Привет, ребята.
Есть такая тема:
Код:
procedure TForm1.Button1Click(Sender: TObject);

var myFile : TextFile;
text: string;
a:string;
i:integer;
begin
randomize;
memo1.Text:='';
a:=edit1.Text;
if edit1.Text=a then
begin
for i:=1 to 10 do
begin
SL:=TStringList.Create;
SL.LoadFromFile('data/'+a+'.txt');
Memo1.Lines.add(GetRandomLine(SL )); 
end;
end;
Мне надо чтобы рандом не повторял одни и те же цифры (т.е. строки).
Это приблизительно я думаю делается через массив, вот только на практике не получается.
Помогите пожалуйста.


______________
glebast, я закрыл все темы, где вы мусолите одну и ту же тему получения случайных строк из текстового файла!
То, что Вы делаете, называется "Кросспостинг", и кросспостинг (создание одинаковых тем) запрещён правилами форума.
Сделайте, пожалуйста, выводы на будущее!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 11.02.2012 в 23:10.
glebast вне форума Ответить с цитированием
Старый 11.02.2012, 20:26   #2
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

glebast вы уже три темы как я видел наплодили с этими строками!
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
memo1.clear;
SL:=TStringList.Create;
SL.LoadFromFile('data/'+a+'.txt');
for i:=1 to 10 do begin
randomize;
Memo1.Lines.add(SL.Strings[random(sl.count-1)]); 
end;
sl.free;
end;
Кольша вне форума Ответить с цитированием
Старый 11.02.2012, 23:00   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Кольша

1) функцию Randomize; крайне желаетельно (рекомендуюется) вызывает ОДИН раз за один сеанс работы приложения. Например, можно её вызов повесить на событии создания окна OnCreate

2) Ваш код не решает проблемы TC c выпадением одних и тех же строк (случайно случайные строки могут совпасть).
чтобы Random не повторял одни и те же строки нужно сохранять номера выбранных строк (например, в массив) и проверять, не было ли ранее выпадение такого номера.
Если нужно, я набрасаю примерчик...



glebast, код в вашем примере просто УЖАСАЮЩИЙ! Мало того, что там утечки памяти гарантированы, так Вы ещё и чтение файла в цикл умудрились засунуть!
Похоже, что Вы вообще не понимаете, что делают приведённые Вами строчки программы

Последний раз редактировалось Serge_Bliznykov; 11.02.2012 в 23:12.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.02.2012, 08:42   #4
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

ну тогда так
Код:
procedure TForm1.Button1Click(Sender: TObject);
function valid(s:string):boolean;
var
I:integer;
begin
for i:=0 to memo1.lines.count-1 do
if memo1.lines.strings[i]=s then begin
result:=false;
exit;
end; 
result:=true;
end;
var
i:integer;
a,s:string;
begin
randomize;
a:=edit1.Text;
memo1.clear;
SL:=TStringList.Create;
SL.LoadFromFile('data/'+a+'.txt');
for i:=1 to 10 do begin
s:=SL.Strings[random(sl.count-1)];
if valid(s) then
Memo1.Lines.add(s);  
end;
sl.free;
end;
////надеюсь дальше сами доработаете?
Кольша вне форума Ответить с цитированием
Старый 12.02.2012, 13:43   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Кольша, ну, уже лучше. уже ПОЧТИ нормально работающий вариант.
вот только есть, на мой взгляд, один подлый глючок:
если случайно выпадут строки, которые уже есть в Memo1 - тогда эти вновь выпавшие не добавятся. И, в результате в Memo получится не 10 строк, а меньше...
тогда я бы предложил такой вариант, если в в текстовом файле ГАРАНТИРОВАНО есть больше 10 различных строк:
Код:
var isValid : boolean;
....
for i:=1 to 10 do begin
  repeat
     s:=SL.Strings[random(sl.count-1)];
     isValid := valid(s);
     if  isValid then Memo1.Lines.add(s);  
  until isValid;
end;
если же есть МАЛЕЙШЕЕ подозрение, что в файле различных строк меньше требуемого числа (меньше 10 в данном случае), я бы ОБЯЗАТЕЛЬНО добавил в код проверку для подсчёта количества азличных строк в тексте, или, хотя бы, на худой конец, я бы добавил защиту от зацикливания:
Код:
const kCycleMax = 100; {даём 100 попыток получить очередную случайную строчку, и, если за 100 раз не удалось получить такую строчку, которой ещё не было в Memo1 - тогда прерываем цикл перебора}
var isValid : boolean;
  kCycle : integer;
....

for i:=1 to 10 do begin
  kCycle := 0;
  repeat
     inc(kCycle);
     s:=SL.Strings[random(sl.count-1)];
     isValid := valid(s);
     if  isValid then Memo1.Lines.add(s);  
  until isValid or (kCycle>kCycleMax);
  if kCycle>kCycleMax then Break; {всё. нечего дальше перебирать - больше случайных строк мы не получим!}
end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Random Vitalya_1993 Помощь студентам 1 19.12.2011 21:39
Random tabanga Помощь студентам 11 10.01.2011 23:45
строки + random DeDoK Общие вопросы Delphi 3 16.07.2010 01:02
Random() Alest Общие вопросы Delphi 2 12.06.2010 00:42
Random NewMen Паскаль, Turbo Pascal, PascalABC.NET 6 16.04.2010 16:11