2015-04-18 1 views
0

J'essaie de remplir chaque rangée d'un tableau à 2 dimensions avec 6 nombres aléatoires d'une liste Enumerable.Range qui contient 45 nombres. Chaque fois que 6 numéros ont été entrés dans la rangée spécifique du tableau, ils sont retirés de la liste. Le problème est que chaque ligne du tableau utilise la même liste jusqu'à ce qu'il n'y reste plus de nombres. Comment réinitialiser la liste pour chaque ligne?Comment remplir une ligne de tableau à deux dimensions avec des nombres aléatoires de la liste Enumerable.Range C#

C'est ce que j'ai jusqu'à présent:

static void InitMatrix(int[,] mat) 
{ 

    List<int> numbers = Enumerable.Range(1, 45).ToList(); 
    Random rnd = new Random(); 

    for (int i = 0; i < mat.GetLength(0); i++) 
    { 
     if(mat.GetLength(0)< mat.GetLength(1)) 

     for (int j = 0; j < mat.GetLength(1); j++) 
     { 
      int index = rnd.Next(0, numbers.Count); 
      mat[i, j] = numbers[index]; 
      numbers.RemoveAt(index); 
     } 
    } 
} 
+0

Si vous souhaitez réinitialiser la liste à chaque fois, déclarer à l'intérieur de la boucle. Quelque chose comme 'Liste numéros = nouvelle Liste ; ... numbers = Enumerable.Range (1, 45) .ToList();' – Eminem

+0

@Eminem Je pense que vous l'avez. Postez cela comme une réponse et je vais vous donner +1. –

+0

@TimS. Je suis trop lent pour ces gars-là .. :) – Eminem

Répondre

1

Déplacez la déclaration de la liste sous la première boucle (ligne). De cette façon, chaque fois que la boucle se déplace à la ligne suivante la liste est réinitialisée/rafraîchi si vous voulez ...

static void InitMatrix(int[,] mat) 
{ 
    Random rnd = new Random(); 

    for (int i = 0; i < mat.GetLength(0); i++) 
    { 
     List<int> numbers = Enumerable.Range(1, 45).ToList(); 

     if(mat.GetLength(0)< mat.GetLength(1)) 
     { 
      for (int j = 0; j < mat.GetLength(1); j++) 
      { 
       int index = rnd.Next(0, numbers.Count); 
       mat[i, j] = numbers[index]; 
       numbers.RemoveAt(index); 
      } 
     } 
    } 
} 
+0

Il y a une erreur de syntaxe ici, le "si (mat ...) à l'intérieur de la boucle n'a pas de parenthèses ou quoi que ce soit en dessous.Il est connu dans le code original mais cela ne marcherait pas non plus.Il est –

+0

@RonBeyer pas une erreur de syntaxe, mais un mauvais formatage L'instruction 'if' s'applique ici à l'instruction' for', c'est-à-dire que le bloc 'for' ne fonctionnera que si mat.GetLength (0)

+0

@TimS oui, vous avez raison, je suppose que mon cerveau est connecté pour voir que le code puant, tout ce qui est plus d'une ligne à moi appartient entre parenthèses –

1

Vous déclarez votre liste de numéros en dehors de la boucle. Cela signifie qu'il n'est pas redémarré après chaque ligne.

static void InitMatrix(int[,] mat) { 
    Random rnd = new Random(); 

    for (int i = 0; i < mat.GetLength(0); i++) 
    { 
     if(mat.GetLength(0)< mat.GetLength(1)) 
     { 
      List<int> numbers = Enumerable.Range(1, 45).ToList(); 
      for (int j = 0; j < mat.GetLength(1); j++) 
      { 
       int index = rnd.Next(0, numbers.Count); 
       mat[i, j] = numbers[index]; 
       numbers.RemoveAt(index); 
      } 
     } 
    } 
} 

Le code n'a pas été testé, mais il devrait fonctionner.