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

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

Неповтояющийся RANDOM


Страницы:   1 2

Заглянувший ©   (2009-10-23 21:40:00) 

Как получить Random с неповторяющимися числами?
К примеру, пусть RandEx такая функция, вызываем RandEx(10) в цикле на 10 иттераций и после каждого прохода эта функция должна выдавать псевдослучайное неповтояющееся число. Как такое сделать?????


Германн   (2009-10-24 01:39:00) [21]


> Anatoly Podgoretsky ©   (24.10.09 00:35) [9]
>
> > Сергей М.  (23.10.2009 23:44:08)  [8]
>
> Рандом возвращает номер на единицу меньше, чем N, как ты
> думаешь, что он может вернуть для N = 0
> Вот для этого я и просил код.
>

Как был язвой, так и остаёшься ею. Очень хорошо.
Рад что ты не покинул наши ряды язв ДМ! Скорблю что наши ряды покинул Кэтмар.
:)


Anatoly Podgoretsky   (2009-10-24 00:35:00) [22]

> Сергей М.  (23.10.2009 23:44:08)  [8]

Рандом возвращает номер на единицу меньше, чем N, как ты думаешь, что он может вернуть для N = 0
Вот для этого я и просил код.


Сергей М.   (2009-10-23 23:44:00) [23]


> Anatoly Podgoretsky ©   (23.10.09 23:35) [7]


Вот ты ж провокатор)

Но изволь, раз уж для разговора:

var
 List: TList;
..
for i := 0 to 9 do
 List.Add(Pointer(i));

while List.Count > 0 do
begin
  Index := Random[List.Count];
  Memo.Lines.Add(IntToStr(Integer(List[Index])));
  List.Delete(Index);
end;


Anatoly Podgoretsky   (2009-10-23 23:35:00) [24]

> Сергей М.  (23.10.2009 22:47:06)  [6]

Да я про текст не для автора, а для предметного разговора.


Сергей М.   (2009-10-23 22:47:00) [25]


> Anatoly Podgoretsky ©   (23.10.09 22:40) [5]


Да я уже упарился его тут писать)
Вопрос-то этот здесь возникает чуть ли не раз в пару недель ..
Нехай автор потрудится, ничего архисложного в реализации предложенной логики нет - всего-то десяток строчек..


Anatoly Podgoretsky   (2009-10-23 22:40:00) [26]

> Сергей М.  (23.10.2009 22:28:04)  [4]

Напиши код, тогда и поговорим.


Сергей М.   (2009-10-23 22:28:00) [27]


> Anatoly Podgoretsky ©   (23.10.09 22:25) [3]


> как быть с последним элементом


А что с ним не так ?


> принято не удалять а перетасовывать значения списка


Нашиша его тасовать, если в каждой итерации извлекается случайный эл-т из оставшихся ?


Anatoly Podgoretsky   (2009-10-23 22:25:00) [28]

> Сергей М.  (23.10.2009 22:04:02)  [2]

А как быть с последним элементом, что делать для него отдельную проверку?
Вообще то принято не удалять а перетасовывать значения списка.


Сергей М.   (2009-10-23 22:04:00) [29]

Забей в массив или список последовательный ряд чисел от 0 до 9
Пока длина L этого массива или списка не равна нулю выполняй итерацию  цикла, в которой выбирай из массива или списка элемент с индексом Random(L) и тут же удаляй этот элемент, так чтобы L уменьшалась на единицу.


Омлет   (2009-10-23 22:01:00) [30]

Например, использовать булевый массив уже занятых значений.

repeat
 x := RandEx(10);
until not mas[x];
mas[x] :=True;

Либо, при попадании на уже занятое значение, смещать вправо или влево, до свободного. Так, наверное, быстрее.


Страницы:   1 2

Наверх

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