Форум: "Начинающим";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
ВнизRandom() Найти похожие ветки
← →
Neiroman © (2006-04-11 08:58) [0]Подскажите, пожалуйста, можно ли как-нибудь избежать повторы при использовании Random()? Или как обработать повтор? Пишу тест со случайной загрузкой вопросов, повторы надоели, некотрые вопросы вообще не используются!. Заранее спасибо.
← →
Сергей М. © (2006-04-11 09:07) [1]
> можно ли как-нибудь избежать повторы при использовании Random()?
Нельзя.
Но можно подойти к использованию Random() с другой стороны :
var
Questions: TStrings;
i: Integer;
..
while Questions.Count > 0 do
begin
i := Random(Questions.Count);
ShowMessage(Questions[i]);
Questions.Delete(i);
end;
← →
tesseract © (2006-04-11 09:42) [2]А что ты хочешь random имеет равномерно распределение.
можешь запоминать номера уже показанных вопросов и запускать генератор заново если повтор.
← →
vovnuke © (2006-04-11 09:52) [3]та перед Random() вызываешь Randomize?
← →
Neiroman © (2006-04-12 02:23) [4]Randomize вызываю. Все равно повторы. Путем запоминания добился только того, что повтор идет не сразу, а через несколько раз. Все равно всем спасибо! Может есть еще способы, кроме Random()?
← →
Германн © (2006-04-12 02:35) [5]
> Может есть еще способы, кроме Random()?
Нет таких способов.
Ты можешь стать первым, кто их создаст! Дерзай, если хочешь!
← →
balepa © (2006-04-12 08:50) [6]Че то не понял надо что бы было так:
первый раз:
1
5
6
8
9
второй:
5
6
1
9
8
и т.д.
или так:
первый раз:
1
5
6
7
3
второй:
2
8
9
4
10
и т. д.
????????????
← →
Старик (2006-04-12 08:59) [7]Насколько я понял, требуется, чтобы в серии сгенерированных чисел не было одинаковых.
Я могу предложить два способа:
1. Нехитрые манипуляции с результатом Random"a и секундами (поделить его на секунду и округлить и т.д.). Способ, конечно, геморный, да и от повторов не спасает, а только снижает их вероятность. Но тем не менее.
2. Раз это тест, то ты, зная сколько у тебя будет задано вопросов, перед началом теста просто сделай так: заведи динамический массив чисел типа Integer. Как только тебе становится известно, сколько у тебя будет вопросов, определяешь длину этого массива. И тут же вызываешь функцию заполнения его случайными числами и при этом проверяешь, нет ли повторов. Если есть - генерируем еще раз. И т.д., пока не заполнишь весь массив. Я примерно так делал, когда корабли в морском бою расставлял :)
← →
balepa © (2006-04-12 09:47) [8]
> Старик (12.04.06 08:59) [7]
А я когда первые свои "Пятнашки" делал :)
← →
wal © (2006-04-12 10:42) [9]
> [7] Старик (12.04.06 08:59)
> Если есть - генерируем еще раз.
Существует маааленькая вероятность не закончить в приемлемое время.
Предлагаю такой вариант:
Создаем массив A со значениями 1-N (или любыми нужными),
создаем массив B с рандомными значениями.
Массив B сортируем любым способом, но вместе с перестановками в массиве B делаем аналогичные перестановки в массиве A. В итоге имеем в A неповторяющиеси значения в произвольном порядке.
С уважением.
ЗЫ. Таким образом можно сформировать СЧ с любой (дискретной) функцией распределения.
← →
Palladin © (2006-04-12 14:35) [10]
> wal ©
и чем это принципиально отличается от [1] кроме ненужных телодвижений со вторым массивом?
← →
wal © (2006-04-12 14:50) [11]
> [10] Palladin © (12.04.06 14:35)
Принципиально ничем, кроме ненужных телодвижений с динамическими структурами ;)
← →
Desdechado © (2006-04-12 15:30) [12]чем больше вопросов, тем меньше шансов повторения
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c