La génération m distinctes nombres aléatoires dans l'intervalle [0..n-1]

J'ai deux méthodes de génération de m distinctes nombres aléatoires dans l'intervalle [0..n-1]

Méthode 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;   
}

Méthode 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;

La première méthode est plus efficace lorsque n est beaucoup plus grand que m, tandis que la seconde est plus efficace autrement. Mais "beaucoup plus grand" n'est pas stricte de la notion, est-il? 🙂

Question: Quelle formule de n et m dois-je utiliser pour déterminer si method1 ou method2 sera plus efficace? (en termes d'espérance mathématique de la durée de fonctionnement)

  • Si m est vraiment petit, n'efficacité tant d'importance? Optimiser pour le cas qui est plus susceptible de causer des problèmes.
  • Je vais dynamiquement obtenir n, et m. Je vais avoir à déterminer d'exécution de la méthode à utiliser
  • Avez-vous testé les deux méthodes avec un couple de différents paramètres? Juste pour avoir une sensation approximative de combien de temps ils prennent.