![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неповтояющийся RANDOM
Заглянувший © (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;
Либо, при попадании на уже занятое значение, смещать вправо или влево, до свободного. Так, наверное, быстрее.