Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-76359
SZap
2003-02-26 19:14
2003.03.24
Проблема с открытием таблици


3-76322
SerKom
2003-03-05 13:58
2003.03.24
Как увидить значения по умольчанию в Db-контралах приложения, не


1-76414
galexis
2003-03-13 16:44
2003.03.24
Заставка приложения


1-76384
Alex Shulg
2003-03-12 11:06
2003.03.24
Обработка сообщений VCL компонента


1-76433
Artemkin
2003-03-11 19:37
2003.03.24
Чтение тэга в винамп





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский