- *Lazarus *publicА как будет няшнее победить массив? Вот есть массив A[1..N], Его надо заполнить числами от 1 до N рандомно и не повторяясь.
1. Заполнять через random[N] и проверять, не генерилось ли такое число ранее.
2. Забить массив числами 1..N, а потом переставлять их местами в случайном порядке, пока не надоест.#1923805from Psi+, 26 days ago
Replies (39)
- @wyldrodney:В ruby использовал бы 2, так как есть метод shuffle. Писал бы сам — первый вариант, так как это проще чем shuffle.#1923805/1from web, 26 days ago
- @HeX:с точки зрения машинного времени первое должно быть быстрее, но второе вроде как результативнее.#1923805/2from web, 26 days ago
- @HeX:в первом сравнение с каждым элементом, я сего не учел. Бери второй метод, он полущ#1923805/4from web, 26 days ago
- @torgash:первый случай будет более общим с учетом того, что чисел может быть и не ровно N, а даже 10^(+-)15 N#1923805/12from TalkGadgetA244D1F5, 26 days ago
- @wyldrodney:Погоди, что значит "рандомно и не повторяясь"? 1,2,3...n чем не вариант?#1923805/13from web, 26 days ago
- @torgash:а вообще-то это делается так: задаешь еще один массив из чисел 1...N, в котором при каждом рандомном выборе записываешь в позицию число N+1 и берешь N+1 как условие пропуска позиции. Рандому, соответственно, нужно будет давать команду, чтобы он не рандомил до посинения, а, единожды наткнувшись на N+1, прошелся по индексам в поисках ближайшего нераспределенного числа.#1923805/14from TalkGadgetA244D1F5, 26 days ago
- @wyldrodney:@torgash Спорим на монетку что ему не нужен массив, а нужны просто рандомные числа несколько раз подряд?)#1923805/15from web, 26 days ago, in reply to /14
- @torgash:@wyldrodney не, ну если ему надо забить n-мерный массив строго числами от 1 до n, то ему реально проще забить его числами от 1 до n, а потом чуток переделать алгоритм сортировки и поменять местами два рандомных элемента n или 2n раз, в зависимости от нужной степени разброса#1923805/16from TalkGadgetA244D1F5, 26 days ago, in reply to /15
- @torgash:но описанный мной выше вариант существенно упрощает рандому задачу и делает все в один проход#1923805/17from TalkGadgetA244D1F5, 26 days ago
- @Veresk:не прально, господа! В общем случае задача выглядит так: есть массив A[N]. Надо получить последовательность M, такую что:
M — случайные.
Все значения M находятся во множестве N.
Если M меньше или равно N, то повторов в последовательности M быть не должно.
Если M больше N, то должно быть задействовано всё множество N, плюс некоторое количество повторов.#1923805/18from Psi+, 26 days ago - @wyldrodney:@Veresk Клавиатуру тебе в жопу и томиком Кнута по ебалу!#1923805/19from web, 26 days ago, in reply to /18
- @AKa:сначала заполнить, потом перемешать, не будут повторяться очевидно, а очередной индекс для копирования/перемешивания всегда будет годный, и понадобится всего один проход по массиву для смешивания.#1923805/20from iro, 26 days ago
- @torgash:заполнить изначально тоже нужно рандомом, если M<=N. В этом и загвоздка: массив[m] заполнится только числами 1...m и не затронет множество N целиком.#1923805/21from TalkGadgetA244D1F5, 26 days ago
- @AKa:пишем код блять
new(m, len); (вроде так создают, не помню)
for i:=0 to len-1 do m[i]:=i;
randomize;
for i:=0 to len-1 do begin
r:=random(len);
buf:=m[len]
m[len]:=m[i];
m[i]:=buf
end;#1923805/26from iro, 26 days ago - @torgash:для случая m<=n, кстати, можно сделать так: взять массив [n], заполнить его 1...n, перетасовать и взять от него первые m элементов, скопировав их в массив [m]. Профит!#1923805/29from TalkGadgetA244D1F5, 26 days ago