- *Lazarus *publicКороче, если надо при тестировании задать вопросов меньше, чем в наличии, то выбираем нужное количество случайных. Если нужно задать вопросов больше, чем есть в наличии, то задаём все что есть в случайном порядке, а потом добавляем сколько угодно повторов случайных. Код такой, надо бы его оптимизировать: pastebin.com#1927882from Psi+, 23 days ago
Replies (25)
- @murrrf:А ты рассматривал идею того, что создаются два временных массива — массив исходных чисел, заполняемый прямой последовательностью, и массив флагов? Дальше из массива исходных чисел берется число в случайной позиции и пишется в результирующий массив, в массив флагов в этой позиции пишется единица. При каждом запросе числа со случайным индексом проверяем, не единица ли во флаге, если да, то ищем индекс ближайшего следующего флага, равного нулю, и берем число с этим индексом. После того, как массив флагов весь заполнится единицами — т.е., весь исходный массив скопирован в результирующий — сбрасываем все флаги в ноль и повторяем, пока результирующий массив не заполнится.
Эта идея позволяет одним и тем же путем заполнять результирующий массив любой длины, но вот оптимальна ли она с точки зрения затрат, не уверен.#1927882/6from WinHome, 23 days ago - @murrrf:@Veresk Я так думаю, и эта идея уже обсуждалась и была отвергнута, но все же выскажу:) Берем исходный массив, прямой, перемешиваем его, пишем в конечный, пока один из двух массивов не кончится. Если конечный короче, то на этом все, если нет — еще раз перемешиваем исходный и снова копируем из него столько элементов, сколько до ближайшего конца массива. И так до полного заполнения конечного массива.#1927882/13from WinHome, 23 days ago, in reply to /12
- @murrrf:@Veresk Подправил твою функцию с использованием моего предложения с повторным перемешиванием — pastebin.com , погляди, имеет ли это смысл.
Кстати, а почему ты начинаешь динамические массивы с единицы?#1927882/15from WinHome, 23 days ago, in reply to /14 - @Veresk:@murrrf Да, думаю это взлетит, но есть пара заметок: циклы For стали вложенными, значит их ещё и много получится. А ещё нас в детстве учили, что while работает медленнее for. Впрочем, это всё равно быстрее, чем рандомить уникальные значения, как было 6 лет назад.#1927882/17from Psi+, 23 days ago, in reply to /15
- @murrrf:@Veresk У меня сейчас нет Лазаруса, есть только Дельфи 2006. Ты посчитай на своей машине тоже, а на моей вышло так. Самая медленная операция — вывод результата в memo8, когда она включена, при массивах исходном в 1000 элементов и конечном — в 3000 результаты десяти обсчетов примерно такие:
Veresk min = 1328
Veresk max = 1359
Veresk med = 1343
murrf min = 1328
murrf max = 1375
murrf med = 1354
А вот если ее выключить, то картина меняется разительно. Мне пришлось выставить 10 000 элементов в исходном и 3 000 000 в конечном, чтобы время выполнения одного обсчета стало отличаться от нуля. И в этом случае получается уже вот так:
Veresk min = 9
Veresk max = 16
Veresk med = 10
murrf min = 31
murrf max = 43
murrf med = 32
Кажется, я выбываю из состязания оптимизаторов в связи с неоптимальностью моего кода...#1927882/20from WinHome, 23 days ago, in reply to /19