Вниз
Скачать: CL | DM;

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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.026 c
2-1144942080
Neopytnyi
2006-04-13 19:28
2006.04.30
Запуск файла


15-1144657188
REA
2006-04-10 12:19
2006.04.30
Common Tasks Pane


2-1144764242
Иван2006
2006-04-11 18:04
2006.04.30
как отловить нажатие Insert


2-1144846419
Dyakon_Frost
2006-04-12 16:53
2006.04.30
Проблема с MessageDlg!


15-1144262820
Hover
2006-04-05 22:47
2006.04.30
Программы для PDA




   Наверх