Здраствуйте, Эксперты! Подскажите алгоритм как в строковом массиве перетасовать элементы случайным образом или, как читать случайные строки из текстового файла, так чтобы какждая строка читалась не более одного раза. Пытаюсь написать программу которая вытаскивает случайною строку из файла с английскими словами для последующего перевода.
Предлагаю "ход конём" (в прямом и переносном смысле): воспользуйся взаимно простыми числами, то есть теми, которые не имеют общих делителей, кроме единицы. Загрузив базу слов из файла, сделай следующие действия:
1. Cnt - Количество слов. Найти такое число (обозначим его Step), которое не имело бы общих делителей с Cnt 2. N - Номер текущего слова. Установить N на произвольное значение между 0 и Cnt-1. i - Номер шага. i := 0 3. N := (N+Step) mod Cnt. i := i+1 4. Выполныть пункт 3 до тех пор, пока не надоест или i
Этот алгоритм работает, но имеет недостаток: следующее слово достаточно предсказуемо. По-моему, его можно модифицировать так, чтобы использовалась пара чисел: шаг вперёд и шаг назад, причём оба
числа взаимно простые по отношению к количеству слов (доказывать возможность или невозможность такого подхода у меня нет времени, оставляю это право Вам) Ответ отправлен: 29.11.2002, 12:22 Отправитель: Артём Шегеда Отвечает Jadd
Здравствуйте, Konstantin! Интересная идея. Можно использовать механизм Randomize для работы с псевдослучайными числами. Но тут есть одно но. Существует некая вероятность того, что некоторые элементы совпадут. Вообще можно рандомно получать индекс строки. Т.е. грузить строки в буфер/массив и тп и рандомно получать ее индекс. Тасовать символы? Надо подумать. Ответ отправлен: 29.11.2002, 16:42 Отправитель: Jadd Отвечает Idle Sign
Здравствуйте, Konstantin! ===== Pro bono publico, no bloody panico! ===== Как вариант: в TStringList грузится содержимое файла (LoadFromFile), после с помощью генератора псевдослучайных чисел (см. рассылку Выпуск №097 за 10.11.2002, 09:10, Вопрос №258) получаем номер строки в пределах от 0 до TStringList.Count, если таковой уж имелся (см. ниже), то повторяем поиск. Работаем с этой строкой, запоминаем ее номер, для сверки "уникальости". Ответ отправлен: 30.11.2002, 09:39 Отправитель: Idle Sign
Вопрос № 310
Здравствуйте, Как распечатать выделенные строки, в смысле эти записи DBGrid в Отчет? Я подумал может выделенные строки можно перекинуть в другой table или query что бы потом вывести его через quickrep. Пожалуйста, буду очень признателен вашим ответ. СПАСИБО!!
Добрый день, dude! Выделенная строка в DBGrid отображает запись, на которой в данный момент стоит указатель таблицы, т.е. печатать можно так: ............. S := Table.Fields[1].Text; Printer.Write(s); ..... Ну, или примерно так. Смысл в том, что работать надо не с DBGrid, а с таблицей.
Ответ отправлен: 30.11.2002, 12:28 Отправитель: Vladimir Отвечает Jadd
Добрый день, dude! Ну, в общем ты почти ответил. Можно запоминать, скажем, какое-то значение из какого-то одного поля и потом строить запрос, а на основании его - отчет. Э-самый очевидный ответ. Можно иначе, но это предоставлю тебе обдумать. Ответ отправлен: 30.11.2002, 01:40 Отправитель: Jadd Отвечает baldr
Приветствую Вас, dude! Именно в Query! А из него - в отчет. Так и надо.
Ответ отправлен: 01.12.2002, 00:29 Отправитель: baldr
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.