Текущий архив: 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.52 MB
Время: 0.009 c