Выбор случайной строки из файла

dukesoteg

Вот решил намутить мини-прогу которая при нажатии на кнопку (Button1) выбирает из текстового файла (в котором список слов) случайные слова и вставляет их в мемо например. Вот.. как сделать чтоб он выбирал их из файла?
11 ответов

dukesoteg

Например, так: Каждое слово в файле (F:TextFile) - отдельная строка, генератором случайных чисел (Random) получать номер строки, контролировать, что номер находится в диапазоне от 0 до количества строк в файле (можно предварительно его подсчитать и задать границы в функции Random), читать функцией ReadLn(F,str) в цикле for до требуемого номера строки. Полученное в строке str использовать.


dukesoteg

А я бы посоветовал залить строки из файла в список (TSringList) и уже работать с ним, гораздо быстрее будет, чем каждый раз устанавливать файловый укзатель на начало файла и читать его до нужной строки...


dukesoteg

а как номер строки получить?


dukesoteg

Вот работает:
procedure TForm1.Button1Click(Sender: TObject);
var
RandomStr: string;
begin
Randomize;
Memo1.Lines.LoadFromFile('Ваше имя файла.txt');
RandomStr:=Memo1.Lines[Round(random*Memo1.Lines.count)];
ShowMessage(RandomStr);
end;


dukesoteg

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


dukesoteg

Mad_Dog, У него random без параметра, а это вещественные числа из интервала (0;1).


dukesoteg

Puporev, Это я понял... А вот теперь если внимательно посмотреть справку по Memo, то можно увидеть следующееUse TMemo to put a standard Windows multiline edit control on a form. Note: Under Win 9x, there is a limit of 64k of text for this control.А теперь рассмотрим в деталях строку кода Викентия
RandomStr:=Memo1.Lines[Round(random*Memo1.Lines.count)];
1. Функция random генерирует случайное число в диапазоне от 0 до 1... 2. Memo1.Lines.count - это не переменная, содержащая количество строк в Memo. Это вызов метода, который возвращает количество строк в Memo... 3. Вычисляется произведение сгенерированного случайного числа на количество строк Memo... 4. Производится округление рассчитанного произведения... А теперь вопрос, стоят ли все эти вычислительные операции для получения простого результата путем всего лишь
RandomStr:=Memo1.Lines[random(Memo1.Lines.count)];


dukesoteg

Mad_Dog, Да кто бы спорил, я просто уточнил что random без параметра это не word.


dukesoteg

Я сперва подумал, что Викентий перепутал символы и вместо '(' поставил '*'. Но потом понял что там не все так просто и весьма запущенно...


dukesoteg

Puporev, Это я понял... А вот теперь если внимательно посмотреть справку по Memo, то можно увидеть следующееUse TMemo to put a standard Windows multiline edit control on a form. Note: Under Win 9x, there is a limit of 64k of text for this control.А теперь рассмотрим в деталях строку кода Викентия
RandomStr:=Memo1.Lines[Round(random*Memo1.Lines.count)];
1. Функция random генерирует случайное число в диапазоне от 0 до 1... 2. Memo1.Lines.count - это не переменная, содержащая количество строк в Memo. Это вызов метода, который возвращает количество строк в Memo... 3. Вычисляется произведение сгенерированного случайного числа на количество строк Memo... 4. Производится округление рассчитанного произведения... А теперь вопрос, стоят ли все эти вычислительные операции для получения простого результата путем всего лишь
RandomStr:=Memo1.Lines[random(Memo1.Lines.count)];
мой код же работает oO N:=Round(Random*10); я так думаю результат будет более случайным


dukesoteg

Ну и зачем изгаляться, если можно просто
n:=random(10);