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 иттераций и после каждого прохода эта функция должна выдавать псевдослучайное неповтояющееся число. Как такое сделать?????


AIK   (2009-10-25 07:46:00) [1]

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

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;


Sha   (2009-10-24 18:26:00) [2]

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

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


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


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


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


Anatoly Podgoretsky   (2009-10-24 18:16:00) [4]

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

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


AIK   (2009-10-24 17:41:00) [5]


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


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

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;


Sha   (2009-10-24 16:50:00) [6]

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

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

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


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


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


Где ?)


AIK   (2009-10-24 16:24:00) [8]


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


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


Sha   (2009-10-24 16:12:00) [9]

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

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


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


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


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


sniknik   (2009-10-24 13:04:00) [11]

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

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

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


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

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

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 ©


oldman   (2009-10-24 12:28:00) [13]


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


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


Anatoly Podgoretsky   (2009-10-24 11:31:00) [14]

Ты схитрил


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


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


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


sniknik   (2009-10-24 10:25:00) [16]

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

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


oldman   (2009-10-24 09:11:00) [17]


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


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

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


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

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


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


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

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


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

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

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


Страницы:   1 2

Наверх

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