|
Вопрос # 2 655/ вопрос открыт / |
|
Здравствуйте, эксперты!
Здравствуйте! Пишу программу тестирования. Есть форма на ней одна кнопка Ответить , TWebBrowser для вывода вопросов из БД и радиокнопки для выбора ответов. На обработчик события нажатия кнопки Ответить я кидаю процедуру QuestGEN (n:integer); - процедура выборки случайного номера вопроса, где n - всего (кол-во) вопросов. Массив куда я сохраняю значения описан внешне .... я его "обнуляю" каждый раз при ShowForm и DestroyForm , т.е заполняю значениями "-1". Ниже привел пример процедуры которую пишу но она почему-то неправильно работает ...помогите пожалуйста исправить или подскажите как лучше с алгоритмом выборки.
Приложение: Переключить в обычный режим- var
- QMass : array [1..100] of integer;
-
- ...............
-
- procedure TTestForm.QuestGen(N:integer);
- var
- i,j,qnum : integer;
- fnd:boolean;
- begin
- fnd:=FALSE;
- Randomize;
-
- showmessage(IntToStr(qnum));
- for i:=1 to QCOUNT do
- begin
- if QMass[i] = qnum
- then fnd:=TRUE
- else fnd:=FALSE;
- end;
-
-
- else QMass[i]:=qnum;
-
- end;
-
-
- ///////////////////////////////////////////
- procedure TTestForm.FormShow(Sender: TObject);
- var
- i:integer;
- begin
-
-
-
- for i:=1 to 100 do
- begin
-
- end;
-
- end;
-
-
-
- procedure TTestForm.FormDestroy(Sender: TObject);
- var
- i:integer;
- begin
-
-
-
-
- for i:=1 to 100 do
- begin
-
- 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]:
СПАСИБО !
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|