Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.24;
Скачать: CL | DM;

Вниз

Подскажите оптимальный вариант   Найти похожие ветки 

 
Nikos   (2003-03-12 15:06) [0]

Здравствуйте.
Пишу тест. В тесте вопрос и 5 разновидностей ответов. Нужно чтобы ответы не появлялись в одном и том же порядке. Есть у меня один вариант, но он не очень хороший. Можно использовать функцию генерации случайных чисел, которая будет генерировать номера ответов, и задать ей диапазон от 1 до 5. Первое число заносим в список выбранных, а последующие сравнивать с тем, что уже выбрано, и если такой ответ уже был выбран, то функция повторяет генерацию номера. Это необходимо, чтобы не было 2-х одинаковых ответов. Этот способ плох тем, что когда остается всего два невыбранных номера ответов, то часто будут выпадать одинаковые ответы (номера ответов), которые находятся в списке выбранных, что приведет к повторной генерации номера, т.е. "холостым" действиям программы.
Схема части кода. (для лучшего понимания моей проблемы)
1. Считываем запись с БД (в ней вопрос и 5 вариантов ответов)
2. Генерируем случайный номер
3. Проверка нет ли этого номера в списке уже выбранных, если нет, то запись номера в список выбранных, иначе переходим к пункту 2.

Есть у меня другая идея.
Схема
1. Считываем запись с БД (в ней вопрос и 5 вариантов ответов)
2. вносим в список номеров все 5 номера
3. генерируем случайный номер
4. выписываем из списка этот номер
5. генерируем случайный номер, но уже из тех чисел, которые остались в списке.

Таким способом можно избежать лишних генераций номеров ответов. Вопрос в следующем, как исключить номер из списка и как сгенерировать случайный номер из оставшихся номеров?


 
stone ©   (2003-03-12 15:15) [1]

После считывания списка, выбрать случайный номер (от 1 до 5) и изменить его в БД на 1 или на любой другой, переприсвоив соответственно друие номера по порядку, т.е.

получили 1 2 3 4 5
генератором получили например 4
в результате в базе иеняем 4 на 1, 1 на 2, 2 на 3, 3 на 4
при следующе построении списка номера будут уже в другом порядке (отличном от первого)

можно реализовать другие варианты по этому принципу


 
REA ©   (2003-03-12 15:38) [2]

For i := 1 To 10 Do
List.Exchange(Random(List.Count), Random(List.Count));


 
theodor_iv ©   (2003-03-12 17:47) [3]

Рекомендую такую процедуру:

procedure FillArray(var A: array of Cardinal);
var
I: Cardinal;

procedure Swap(I, J: Integer);
var
S: Cardinal;
begin
S := A[J]; A[J] := A[I]; A[I] := S;
end;

begin
for I := Low(A) to High(A) do A[I] := I;
for I := High(A) downto 2 do Swap(I, Random(I));
if Random > 0.5 then Swap(0, 1);
end;

// пример использования:
var
A: array[0..4] of Cardinal;
I: Cardinal;
begin
Randomize;
FillArray(A);
for I := Low(A) to High(A) do WriteLN(A[I]);
end.


 
Ipx ©   (2003-03-12 18:40) [4]

2 Nikos (12.03.03 15:06)
Считаю, что первый вариант наилучший.
Четвертый год работаю с подобной тестовой системой. Кстати и задания (к примеру 25 из 100) также формирую с помощью генератора случайных чисел.



Страницы: 1 вся ветка

Текущий архив: 2003.03.24;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.027 c
1-76450
Leran2002
2003-03-11 15:34
2003.03.24
Lotus Notes 5


14-76627
BALU1111
2003-03-07 19:06
2003.03.24
А почему люди домой не идут???


1-76386
Mst
2003-03-13 10:23
2003.03.24
rundll32.exe


1-76401
АндрейБ
2003-03-13 02:39
2003.03.24
массив типа variant


1-76455
Игорь Шевченко
2003-03-11 14:29
2003.03.24
OpenDialog порождает дополнительные потоки