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