Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 611

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!

Мое знание Дельфи немного выше нуля, поэтому мне и приходится порой обращатся именно к вам. Я хотел бы чтобы кто нибудь из вас объяснил принцип Рандомности в Дельфи. Как это реализовать, осуществить..?
Как пример:
У меня есть программа блокнот. Я хочу чтобы в поле Memo каждые 10 секунд добавлялась одна из этих 10 строк, причем случайно. Где мне их хранить, как должен выглядить код... Буду рад услышать ответ на доступном мне языке. Заранее спасибо:)!

Fen-Omen Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Fen-Omen (статус: Посетитель)
Вопрос отправлен: 2 июня 2007, 02:30
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Yurchik

Здравствуйте, Fen-Omen!

В Дельфи генерация случайных чисел связана с двумя подпрограммами - Random и Randomize. Randomize производит начальную инициализацию, а Random возвращает псевдослучайное число.
В большинстве случаев генерация случайных чисел осуществляется следующим образом. Есть некоторое число (в Дельфи это переменная RandSeed), и каждый раз биты этого числа изменяются по специальному алгоритму. Таким образом, при одинаковом начальном значении этого числа любое количество вызовов Random будет давать одинаковые последовательности чисел. Чтобы избежать этого, используют функцию Randomize, которая инициализирует RandSeed случайным значением, обычно получаемом из системного времени.
Итак:
Randomize - запускается одни раз в начале программы (например, при создании формы)
Random(Range: Integer) - возращает псевдослучайное целое число в диапазоне 0 <= X < Range
Random() - возращает псевдослучайное число с плавающей точкой в диапазоне 0 <= X < 1
Код смотри в приложении

Приложение:
  1. type
  2. TForm1 = class(TForm)
  3. Memo1: TMemo;
  4. Timer1: TTimer;
  5. procedure Timer1Timer(Sender: TObject);
  6. procedure FormCreate(Sender: TObject);
  7. procedure FormDestroy(Sender: TObject);
  8. private
  9. { Private declarations }
  10. Phrases: TStrings;
  11. ...
  12.  
  13. procedure TForm1.Timer1Timer(Sender: TObject);
  14. begin
  15. try
  16. with Phrases do
  17. Memo1.Lines.Add(Strings[Random(Count)]);
  18. except
  19. end;
  20. end;
  21.  
  22. procedure TForm1.FormCreate(Sender: TObject);
  23. begin
  24. Randomize;
  25. Phrases:= TStringList.Create;
  26. Phrases.LoadFromFile('phrases.txt');
  27. end;
  28.  
  29. procedure TForm1.FormDestroy(Sender: TObject);
  30. begin
  31. Phrases.Free;
  32. end;


Ответ отправил: Yurchik (статус: 3-ий класс)
Время отправки: 2 июня 2007, 16:58

Ответ #2. Отвечает эксперт: Николай Рубан

Здравствуйте, Fen-Omen!

Вам достаточно на форме разместить компонент Timer1 и настроить его таким образом:
Свойство Interval=10000 (т.е. 10 секунд); Enabled=true;

Код с комментариями, который выполняется при событии OnTimer смотрите в приложении.

Good Luck!!!

Приложение:
  1. procedure TForm1.Timer1Timer(Sender: TObject);
  2. var f:TextFile;
  3. s:string;
  4. p,i:integer;
  5. begin
  6. randomize;
  7.  
  8. i:=0;
  9.  
  10.  
  11. while i<>p do
  12.  
  13.  
  14. CloseFile(f);
  15. end;


Ответ отправил: Николай Рубан (статус: 10-ый класс)
Время отправки: 2 июня 2007, 17:09

Ответ #3. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Fen-Omen!
Получение случайного числа - очень сложная и нерешенная еще в цифровой технике задача, поэтому используют Генераторы Псевдослучайных Чисел, для криптографческих нужд используют специальные, сложные алгоритмы? чтобы невозможно было предугадать следующие случайное число по ряду предыдущих. А функция Rnd/Random в большинстве языков программирования реализуется с помощью простого Линейного Конгруэнтного метода.

Конкретно для Delphi - следующие число ГСЧ полностью определяется значением переменной RandSeed, а Randomize изменяет RandSeed функцией от времени. Число 08088405h делится на RandSeed, потом к этому числу добавляется еденица и это число помещается в RandSeed (это косается получения целого числа, но дя дробных все аналогично).

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 3 июня 2007, 13:57


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 2 июня 2007, 02:36; участников в обсуждении: 1.
Fen-Omen

Fen-Omen (статус: Посетитель), 2 июня 2007, 02:36 [#1]:

"Я хочу чтобы в поле Memo каждые 10 секунд добавлялась одна из этих 10 строк, причем случайно." - В том смысле что у меня есть 10 предложений\фраз\строчек, хранятся допустим в txt.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:56
Выполнено за 0.02 сек.