Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо