2014-04-27 1 views
0

Je crée un programme pour une classe qui appelle le programme à créer 6 entiers générés aléatoirement dans la plage 1-40 et à les placer dans un tableau. Les entiers doivent être uniques donc il ne peut pas y avoir une situation où un nombre certain nombre répète. Le tableau est ensuite transmis à une autre méthode qui trie le tableau dans l'ordre croissant. Mon problème est que je ne peux pas obtenir mon code pour générer 6 numéros uniques. Mon code est le suivant:Prévention des entiers en double dans la matrice

private static void getComputer(int computerNumbers, int[] cN) 
{ 
    Random randomNumbers = new Random(); 

    for (int i = 0; i < computerNumbers;) 
    { 
     int computerStored = randomNumbers.nextInt(39)+1; 
      if (computerStored == cN[0] || computerStored == cN[1] || computerStored == cN[2] || 
       computerStored == cN[3] || computerStored == cN[4] || computerStored == cN[5]) 
       continue; 
      else 
       computerStored = cN[i]; 
       i++; 
    } 
} 

Le bloc au-dessus du code renvoie un tableau de 0,0,0,0,0,0. Je ne peux pas trouver pourquoi. Toute aide serait très appréciée. Je vous remercie. Juste pour clarifier, je sais comment faire un générateur aléatoire de base.

private static void getComputer(int computerNumbers, int[] cN) 
{ 
    Random randomNumbers = new Random(); 

    for (int i = 0; i < computerNumbers; i++) 
     cN[i] = randomNumbers.nextInt(39)+1; 
} 

Répondre

0

Vous vouliez probablement dire

cN[i] = computerStored; 

Notez également qu'il ya trois problèmes avec ce code: vous passez dans la taille du tableau, ce qui est une mauvaise forme en Java, vous ne pouvez jamais obtenir zéro (ce qui n'est techniquement pas un bug dans ce cas puisque vous avez juste 1-40), et votre conditionnel est vraiment compliqué. Au lieu de cela, je ferais ceci:

for(int i = 0; i < cN.length;) { 
    int candidate = randomNumbers.nextInt(39) + 1; 

    // actually, I'd either move this into another method or use a `Set` in the first place 
    boolean duplicate = false; 
    for(int j = 0; j < i || !duplicate; j++) 
     if(candidate == cN[j]) 
      duplicate = true; 

    if(!duplicate) 
     cN[i++] = candidate; 
} 
+0

WOW. Une si petite différence pourrait-elle vraiment être la réponse? Je l'ai essayé et cela a fonctionné. Je vous remercie. Pourquoi exactement cela résout-il le problème? – user3577449

+0

@ user3577449 ​​'computerStored = cN [i]' signifie "mettre la valeur de' cN [i] 'dans' computerStored' ", et l'inverse veut dire" mettre la valeur de 'computerStored' dans' cN [i] '" . Les instructions de programmation sont très spécifiques, et l'ordinateur fera exactement ce que vous dites, pas ce que vous vouliez dire mais n'a pas fait. – chrylis

+0

Il résout le problème car vous réaffectiez la valeur 'computerStored' générée en la plaçant à gauche de l'opérateur =. Donc, le tableau n'a jamais été mis à jour. –

0

J'aborderions cela d'une manière différente:

  • créer une liste d'entiers 1-40
  • les mélanger
  • créer un tableau à partir les 6 premiers éléments

comme ceci:

List<Integer> list = new ArrayList<>(40); 
for (int i = 1; i < 41; i++) 
    list.add(i); 
Collections.shuffle(list); 
int[] cN = new int[6]; 
for (int i = 0; i < cN.length; i++) 
    cN[i] = list.get(i); 

L'avantage de cette approche est que vous n'avez pas à gérer le problème des doublons et que vous utilisez le JDK pour effectuer la randomisation.

Questions connexes