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