Генерация m различных случайных чисел в диапазоне [0..n-1]

У меня есть два метода генерации m различных случайных чисел в диапазоне [0..n-1]

Метод 1:

//C++-ish pseudocode
int result[m];
for(i = 0; i < m; ++i)
{
   int r;
   do
   {
      r = rand()%n;
   }while(r is found in result array at indices from 0 to i)
   result[i] = r;   
}

Метод 2:

//C++-ish pseudocode
int arr[n];
for(int i = 0; i < n; ++i)
    arr[i] = i;
random_shuffle(arr, arr+n);
result = first m elements in arr;

Первый метод более эффективен, когда n намного больше m, тогда как в противном случае второй более эффективен. Но «намного больше» - не такое уж строгое понятие, не так ли? :)

Вопрос: Какую формулу n и m мне следует использовать, чтобы определить, какой метод будет более эффективным: method1 или method2? (в терминах математического ожидания времени работы)

31
задан Veger 4 August 2011 в 19:51
поделиться