Форум: "Основная";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];
ВнизПодскажите оптимальный вариант Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c