|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Sergey Kabikov 2:5020/175.2 30 Aug 2001 14:59:54 To : Boris Sivko Subject : Hужно решение -------------------------------------------------------------------------------- Thu Aug 30 2001 08:20, Boris Sivko wrote to Abbat: A>> Есть массив целых чисел от 0 до N (на практике N не больше 100). Числа A>> в массиве расположенны по порядку (0-100). Требуется перемешать массив A>> произвольным образом. Скорость критична (счет идет на ms). BS> ------ From: Leonid Troyanovsky BS> for i := Low(a) to High(a) do BS> begin BS> idx := Low(a) + Random(SizeOf(a)); BS> tmp := a[i]; BS> a[i] := a[idx]; BS> a[idx] := tmp; BS> end; Это не совсем оптимальный способ. Легко заметить, что N перестановок хорошо перемешают массив из N элементов не всегда. Я бы сделал так : for i := Low(a) to High(a)-1 do begin idx := i + Low(a) + Random(SizeOf(a) - i); и далее по тексту. Разница в том, что на каждом шаге фиксируется один случайно выбранный элемент массива, который в дальнейших перестановках не участвует. IMHO статистически это правильнее. С уважением Сергей ...Планетоид на эпилептической орбите (с) переводчик StarTrek --- ifmail v.2.15 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/3300e3872a83.html, оценка из 5, голосов 10
|