Собственно возникла такая необходимость в одной из программ вытаскивать случайное слово из строки, самому писать было лень, гугление не принесло результатов, пришлось вспомнить былые годы и напрячь мозговые центры ))))
Ничего сложного нет, алгоритм прост, хотя я и не настаиваю на его универсальности и простоте, кому как, но на скорую руку написал следующее, в двух словах по алгоритму, в строке выдергиваем случайный символ, и если это не пробел, то увеличиваем номер символа пока не получаем пробел (банально )))), после удалем из строки все символы, начиная с первого, заканчивая пробелом, далее копируем в результат все, начиная с первого символа, заканчивая пробелом, номер символа которого мы получим из Pos(‘ ‘, str).
Хватит бесполезной болтовни, вот вам функция:
//by username https://i-notes.org
function GetRandomWord(Str: string): string; //функция получения случайного слова из текста
var Sl, rd: Integer;
begin
Sl:= Length(Str); //длина строки
Randomize; //инициализируем генератор случайных чисел
rd:= Random(Sl);
while Str[rd]<>' ' do Inc(rd); //ищем пробел
Delete(Str, 1, rd); //удаляем все до пробелам
Result:= Copy(Str, 1, Pos(' ', str)-1); //результат с первго символа до пробела
end;
З.Ы. пипец накрутил с описанием алгоритма, надо было схемой зарисовать,ну ладно, может в следующий раз, а пока что, если что не ясно, не стесняемся, пишем
2 комментария. Оставить новый
Как я писал в статье, гавнокодил на скорую руку, поэтому не настаиваю на его универсальности, многих проверок не делал, т.к. исходный текст всегда содержал пробелы, но в целом согласен, добавить проверку на наличие пробела можно, например добавить условие, проверяющее, Pos(‘ ‘, str), чтобы не было равно нулю.
95% кода в интернете — говно. Случайно наткнулся на данную чудо-функцию. И вот какие соображения.
Чтобы выбрать именно СЛУЧАЙНОЕ слово из строки, надо для начала хотя бы знать количество этих слов. Что, если в строке вообще нет пробелов? Тогда функция отработает неправильно.
Далее, ищем пробел, удаляем всё до пробела, и затем:
Result:= Copy(Str, 1, Pos(‘ ‘, str)-1)
Занимательно. А что, если пробела в str не будет? Благо, Copy таки отработает. И слава Богу.