Re: масив чисел

From
Oleg I. Khovayko ()
To
Evgenij Masherov
Date
2003-01-03T17:03:07Z
Area
RU.ALGORITHMS
From: "Oleg I. Khovayko" <olegh@ncbi.nlm.nih.gov>

Evgenij Masherov wrote:

> 
>  EM>> Дешево. Сердито. И неверно. В том смысле, что равновероятность всех
>  EM>> перестановок не обеспечивается. 
> 
> В приведенном алгоритме третий элемент принципиально не может оказаться на
> третьем месте. Т.е. две перстановки из шести (и одна - со вторым) выпадают...
> 

Мда, есть такое. Но клиенту же нужно "гарантированое перемешивание", поэтому
приведенный ранее алгоритм как раз его и обеспечивает, искусственно исключая
вырожденые случаи. Кроме того, он чуть-чуть проще "математически верного".
Поэтому именно его я и рекомендовал для практической реализации.

Если же интересует именно "математически верный" алгоритм, то вот он:

int mas[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

for(int i = 9; i > 0; i--) {
   int j = random() % (i + 1);
   if(i != j) {
     int tmp = mas[j];
     mas[j] = mas[i];
     mas[i] = tmp;
   }
}

Смысл следуюший:
Пусть у нас есть колода карт (игральных). Ее надо перемешать.
Простейший вариант перемешивания такой: 

Пока колода не пуста:
	Извлекаем из колоды 
	случайную карту, и ложим ее в отдельную стопку.

Приведенный выше алгоритм - как раз программная 
реализация этой идеи, где входная и выходная стопки совмещены.

-- 
#include <best/regards.hpp>
Oleg I. KHOVAYKO  
(301)435-5885 || WEB: http://olegh.spedia.net
--- ifmail v.2.15dev5
 * Origin: National Center for Biotechnology Information (2:5020/400)