| 
| 
 | Вопрос # 2 655/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Здравствуйте! Пишу программу тестирования. Есть форма на ней одна кнопка Ответить , TWebBrowser для вывода вопросов из БД и радиокнопки для выбора ответов. На обработчик события нажатия кнопки Ответить я кидаю процедуру QuestGEN (n:integer); - процедура выборки случайного номера вопроса, где n - всего (кол-во) вопросов. Массив куда я сохраняю значения описан внешне .... я его "обнуляю" каждый раз при ShowForm и DestroyForm , т.е заполняю значениями "-1". Ниже привел пример процедуры которую пишу но она почему-то неправильно работает ...помогите пожалуйста исправить или подскажите как лучше с алгоритмом выборки.
 Приложение:Переключить в обычный режим var QMass : array [1..100] of integer; ............... procedure TTestForm.QuestGen(N:integer);vari,j,qnum : integer;fnd:boolean;beginfnd:=FALSE;Randomize; showmessage(IntToStr(qnum));for i:=1 to QCOUNT dobeginif QMass[i] = qnumthen fnd:=TRUEelse fnd:=FALSE;end;  else QMass[i]:=qnum; end;  ///////////////////////////////////////////procedure TTestForm.FormShow(Sender: TObject);vari:integer;begin   for i:=1 to 100 dobegin end; end;   procedure TTestForm.FormDestroy(Sender: TObject);vari:integer;begin    for i:=1 to 100 dobegin end;end;
|  |   Вопрос задал: Motor (статус: Посетитель)Вопрос отправлен: 17 апреля 2009, 21:29
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Мережников Андрей Здравствуйте, Motor!Уберите randomize из процедуры. Эта функция должна вызываться только один раз. Поставьте ее вызов, например, в FormShow
 
|  | Ответ отправил: Мережников Андрей (статус: Абитуриент)Время отправки: 18 апреля 2009, 06:43
 Оценка за ответ: 4
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 19 апреля 2009, 04:23; участников в обсуждении: 3. 
|   | Мережников Андрей (статус: Абитуриент), 18 апреля 2009, 06:48 [#1]:Да, еще. в дополнение к ответу перепишите цикл поиска совпадений следующим образом: i:=1;
 while(i<=QCount)and not(fnd)
 do if (Qmass[i]=qnum)
 then fnd:=true
 else inc(i);
 |  
|   | Motor (статус: Посетитель), 18 апреля 2009, 07:32 [#2]:Большое Вам человеческое СПАСИБО !!!! Буду тестить  )) |  
|   | Motor (статус: Посетитель), 18 апреля 2009, 08:13 [#3]:всеравно что-то неправильно отрабатывает ...поставил randomize; в событие FormShow...далее изменил процедуру как вы и сказали : 
 procedure TTestForm.QuestGen(N:integer);
 var
 i,j,qnum : integer;
 fnd:boolean;
 begin
 fnd:=FALSE;
 qnum:=Random(N)+1;  // выбираем случайным образом вопрос
 showmessage(IntToStr(qnum));
 i:=1;
 while(i<=QCount)and not(fnd) do
 if (Qmass[i]=qnum)
 then fnd:=true
 else inc(i);
 
 if fnd then Showmessage('УЖО БЫЛ')
 else QMass[i]:=qnum;
 
 end;
 
 
 может массив описан не правильно ? вроде как надо, внешне в данном Unit-e , как var QMass : array [1..100] of integer;
 
 может проблема в том что я использую конструкцию в событиях FormShow и Formdestroy ? :
 
 for i:=1 to 100 do
 begin
 QMass[i]:=-1; // очищаем массив под выборку
 end;
 |  
|   | Motor (статус: Посетитель), 18 апреля 2009, 08:46 [#4]:procedure TTestForm.QuestGen(N:integer); var
 i,j,qnum : integer;
 fnd:boolean;
 begin
 fnd:=FALSE;
 qnum:=Random(N)+1;  // выбираем случайным образом вопрос
 showmessage(IntToStr(qnum));
 i:=1;
 while(i<=QCount)and not(fnd) do
 if (Qmass[i]=qnum)
 then fnd:=true
 else inc(i); QMass[qnum]:=qnum;
 if fnd then Showmessage('УЖО БЫЛ');
 
 end;
 
 переписал вроде работает .....тока непойму как массив заполняется?
  ...и еще не пойму как дописать фишку, если все N вопросы исчерпаны то закрыть окно ...или остановить цикл .....??? |  
|   | Вадим К (статус: Академик), 18 апреля 2009, 11:53 [#5]:По поводу Randomize. Он должен вызываться всего один раз в программе. Больше его вызывать не стоит, от этого "случайность" не улучшиться ни на йоту. А в некоторых реализациях (для других языков, но не для делфи) постоянный вызов может привести к том, что значения генератора будет одно и тоже.
 Почему же random выдает одну и туже последовательность при каждом запуске программы? Это не ошибка и не бага, а специально сделанная функциональность для упрощения отладки. Представьте во что превратилась отладка, если random выдавал каждый раз новые числа. Отладка должна быть детерментированной, то есть определенной.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Motor (статус: Посетитель), 19 апреля 2009, 04:23 [#6]:СПАСИБО ! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |