Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.13;
Скачать: CL | DM;

Вниз

Неповтояющийся RANDOM   Найти похожие ветки 

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

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


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

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

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

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


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

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


 
Anatoly Podgoretsky ©   (2009-10-23 22:25) [3]

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

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


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


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


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


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


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


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


 
Anatoly Podgoretsky ©   (2009-10-23 22:40) [5]

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

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


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


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


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


 
Anatoly Podgoretsky ©   (2009-10-23 23:35) [7]

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

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


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


> 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-24 00:35) [9]

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

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


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


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

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


 
Омлет   (2009-10-24 01:53) [11]

> Скорблю что наши ряды покинул Кэтмар.

Он что ли опять возвращался? ))


 
Германн ©   (2009-10-24 02:02) [12]


> Омлет   (24.10.09 01:53) [11]
>
> > Скорблю что наши ряды покинул Кэтмар.
>
> Он что ли опять возвращался? ))
>

И не один раз. :)
Ждём следующей реинкарнации.


 
Григорьев Антон ©   (2009-10-24 08:58) [13]

А в целом какая задача стоит? Зачем нужны неповторяющиеся числа? Просто есть некоторые задачи, для которых на первый взгляд нужны неповторяющиеся случайные числа, но их можно решать и другими алгоритмами, где требование неповторения отсутствует.


 
oldman ©   (2009-10-24 09:11) [14]


> Заглянувший   (23.10.09 21:40)  


заводится массив a[10], заполняется нулями
функция, получив случайное число i проверяет a[i]
если 0, a[1]:=1, i возвращается
если 1, генерим новое i

у меня так работало на 100 элементах (делал когда-то давно тест-опросник)
работало довольно шустро, для проверки делал 100 иттераций, возвращало все числа от 1 до 100 в случайной последовательности


 
sniknik ©   (2009-10-24 10:25) [15]

> А в целом какая задача стоит?
блин, вот как бы приучить начинающих "какбы програмистов" здесь, решать именно задачу, а не те частные проблемы, что они встретили на пути... ну и вопросы соответственно задавать, без лишних подробностей, они не нужны, но, что решается все таки писать сразу... (ну и задачи "сдать лабу" не катят, это уже более общая, а не программисткая, решаемая).
но похоже отделить реальную задачу от проблем на пути решения для многих просто непосильная задача :)...

> делал когда-то давно тест-опросник
вот это как раз та задача когда не повторяющиеся числа нафиг не нужны...
вот у тебя список вопросов, в базе->таблице или рекордсете (даже если просто в тексте с данными удобнее работать запихав их в рекордсет).
задача выдать вопросы в случайном порядке (а вовсе не в неповторяющихся случайных числах...) - добавляем поле сортировки, присваиваем ему случайное значение, и сортируем по нему. все задача решена, берем записи по одной по порядку, он будет случайным , и даже если там вдруг пара значений совпадет... 2 записи физически не смогут занять одну позицию, они будут рядом, где какая никто не знает, т.е. и тут случайное местоположение (если к полю сортировки не добавить еще одно, другое, тогда порядок этих двух определится им).


 
Сергей М. ©   (2009-10-24 11:09) [16]


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


А где ты видишь чтобы в этом коде N могло стать равным нулю ?


 
Anatoly Podgoretsky ©   (2009-10-24 11:31) [17]

Ты схитрил


 
oldman ©   (2009-10-24 12:28) [18]


> sniknik ©   (24.10.09 10:25) [15]
> > делал когда-то давно тест-опросник
> вот это как раз та задача когда не повторяющиеся числа нафиг
> не нужны...


ну и чем мой способ хуже твоего?
Ведь чтобы присвоить случайное значение полю сортировки или проверить его с массивом телодвижения те же самые...


 
AIK ©   (2009-10-24 12:47) [19]

Когда-то обращался с похожим вопросом. перемешка эффективней

var
N, j, i, temp: integer;
A: array[0..10] of integer;
begin
N:=10;
Randomize;
for i := 0 to N - 1 do
  A[i] := i + 1;
for i := N - 1 downto 0 do begin
  temp := A[i];
  j := Random(i + 1);
  A[i] := A[j];
  A[j] := temp;
end;
...
end;


MBo ©


 
sniknik ©   (2009-10-24 13:04) [20]

> Ведь чтобы присвоить случайное значение полю сортировки или проверить его с массивом телодвижения те же самые...
в случае с базой все делается в запросе, добавляешь там поле rnd() и ордер by по нему. проверки не нужны (какой еще массив если у тебя сами вопросы опроса в таблице?), а запрос ты так и так делаешь...

но вообще конечно можно придумать ситуации когда сортировка займет даже больше "телодвижений".

дело не в этом, я вовсе не хотел показать, что мой вариант оптимальнее, я хотел показать, что сама "проблема" не повторяющихся случайных значений, часто надумана и лишняя, если решать не ее, а реальную задачу.


 
oldman ©   (2009-10-24 13:37) [21]


> sniknik ©   (24.10.09 13:04) [20]
> дело не в этом, я вовсе не хотел показать, что мой вариант
> оптимальнее


тогда пардон :)


 
Sha ©   (2009-10-24 16:12) [22]

> AIK ©   (24.10.09 12:47) [19]
> Когда-то обращался с похожим вопросом. перемешка эффективней

Это не перемешивание, а случайный выбор из оставшихся элементов.


 
AIK ©   (2009-10-24 16:24) [23]


> Это не перемешивание, а случайный выбор из оставшихся элементов.


Это перемешивание, смотри внимательней


 
Сергей М. ©   (2009-10-24 16:26) [24]


> Anatoly Podgoretsky ©   (24.10.09 11:31) [17]
>
> Ты схитрил


Где ?)


 
Sha ©   (2009-10-24 16:50) [25]

> AIK ©   (24.10.09 16:24) [23]
> Это перемешивание, смотри внимательней

При помощи случайного выбора из оставшихся элементов,
например, выбирая из колоды случайную карту и откладывая ее в сторону,
можно добиться перемешивания колоды.
И это будет соответствовать нашим представлениям о случайном порядке.

При помощи произвольного перемешивания,
например, случайно переставляя карту на нечетном и следующем за ним четном месте, тоже можно перемешать колоду.
Но вряд ли этот порядок будет совершенно случайным.


 
AIK ©   (2009-10-24 17:41) [26]


> При помощи произвольного перемешивания,
> например, случайно переставляя карту на нечетном и следующем
> за ним четном месте, тоже можно перемешать колоду.
> Но вряд ли этот порядок будет совершенно случайным.


Ну уж если рассуждать так как ты говоришь то вот

var
N, j, i, l, temp: integer;
A: array[0..9] of integer;
begin
N:=10;
Randomize;
for i := 0 to N - 1 do
  A[i] := i + 1;
for i := 0 to 9 do begin
  temp := A[i];
  l:=  Random(9);
  j := Random(9);
  A[i] := A[j];
  A[j] := temp;
end;


 
Anatoly Podgoretsky ©   (2009-10-24 18:16) [27]

> Сергей М.  (24.10.2009 16:26:24)  [24]

Сделал не так, как я ожидал.


 
Сергей М. ©   (2009-10-24 18:21) [28]


> Anatoly Podgoretsky ©   (24.10.09 18:16) [27]


Не знаю уж что ты там ожидал, но [8] полностью соответствует [2]


 
Sha ©   (2009-10-24 18:26) [29]

> AIK ©   (24.10.09 17:41) [26]

Не понял, зачем там нужна переменная l.


 
AIK ©   (2009-10-25 07:46) [30]

упс, не доконца переправил

var
N, j, i, l, temp: integer;
A: array[0..9] of integer;
begin
memo1.Clear;
N:=10;
Randomize;
for i := 0 to N - 1 do
  A[i] := i + 1;
for i := 0 to 9 do begin
  L:=  Random(9);
  j := Random(9);
  temp := A[l];
  A[L] := A[j];
  A[j] := temp;
end;
...
end;



Страницы: 1 вся ветка

Текущий архив: 2009.12.13;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.017 c
2-1256210880
Nucer
2009-10-22 15:28
2009.12.13
Вопрос по исключениям


2-1256315797
xyz
2009-10-23 20:36
2009.12.13
WriteFile не компилируется


2-1256647123
Morgan128
2009-10-27 15:38
2009.12.13
Частичная блокировка клавиатуры


3-1231324322
Palladin
2009-01-07 13:32
2009.12.13
Параметры ADO и условие like


15-1255166733
TStas
2009-10-10 13:25
2009.12.13
Как работают подпрограммы?