2 votes

Comment puis-je vérifier si chaque int dans un tableau généré aléatoirement est pair et faire en sorte qu'il crée un autre tableau aléatoire si ce n'est pas le cas ?

J'essaie donc de créer un programme qui crée un tableau généré aléatoirement avec des nombres entre 0 et 10. Chaque fois qu'un nombre à l'intérieur du tableau 4x4 est impair, je veux qu'il génère un tout nouveau tableau et qu'il imprime tous les tableaux rejetés jusqu'à ce qu'il crée un tableau 4x4 avec seulement des nombres pairs. Le problème est que je n'arrive pas à comprendre comment corriger la dernière erreur. for et le faire fonctionner correctement avec le booléen b qui est censée relancer la création du tableau.

import java.util.Scanner;

public class EvenArrayGenerator {
    public static void main(String a[]) {

        Boolean b;
        do {
            b = true;
            int[][] Array = new int[4][4];
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++)
                    Array[i][j] = (int) (Math.random() * 11);
            }

            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    System.out.print(Array[i][j] + " ");

                }
                System.out.println();
            }
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    if (Array[i][j] % 2 != 0)
                        b = false;

                }
            }

        } while (b);
    }
}

1voto

J. Lengel Points 510
public class ArrayGen {

private int[][] array = new int[4][4];
    private int iterations = 1;  // you always start with one iteration

public static void main (String[] args) {

    ArrayGen ag = new ArrayGen();

    ag.reScramble();

    while(!ag.isAllEven()) {

        ag.reScramble();
        ag.iterations++;
    }

    // this is just a nice visualisation

    for (int i = 0; i < 4; i++) {

        System.out.print("[");

        for (int j = 0; j < 4; j++) {

            System.out.print(ag.array[i][j] +((j != 3)? ", " : ""));
        }

        System.out.print("]\n");
    }
    System.out.println(ag.iterations + " iterations needed to get all-even array.");
}

private void reScramble () {

    for (int i = 0; i < 4; i++) {

        for (int j = 0; j < 4; j++) {

            array[i][j] = (int)(Math.random() * 11);
        }
    }
}

private boolean isAllEven () {

    for (int i = 0; i < 4; i++) {

        for (int j = 0; j < 4; j++) {

            if (array[i][j] % 2 == 1) {

                return false;
            }
        }
    }

    return true;
}
}

Je pense que c'est une bonne solution. Refondre son code en méthodes structurées n'est jamais une mauvaise idée. J'espère que cela vous aidera !

0voto

Mureinik Points 61228

Vous faites une boucle jusqu'à ce que vous obteniez un tableau pair. Vous devriez initialiser b être false et l'actualiser en true dans le (imbriqué) for boucle. Notez qu'une fois que vous l'avez réglé sur false il n'y a pas de raison de vérifier les autres membres du tableau, et vous pouvez sortir du cadre du for boucle.

Notez également que l'utilisation de stream pourrait rendre cette vérification un peu plus élégante :

b = Arrays.stream(arr).flatMapToInt(Arrays::stream).anyMatch(x -> x % 2 != 0)

0voto

Pourquoi ne pas générer des nombres aléatoires jusqu'à 5 et les doubler ? Il n'est alors pas nécessaire de vérifier s'ils sont pairs.

0voto

jrsall92 Points 305

Au lieu de votre dernière boucle for :

for(int i=0;i<4;i++){
    for(int j=0;j<4;j++){
        if(Array[i][j] % 2!=0){
            b=false;
            break;
        }
    }
    if(!b){
        break;
    }
}
if(!b){
    break;
}

Vous pouvez également effectuer un contrôle des bizarreries lorsque vous générez les éléments. Quelque chose comme :

int element;    
for(int i=0;i<4;i++){
    for(int j=0;j<4;j++){
        do{
            element = (int)(Math.random()*11);
        }while(element % 2 !=0)
        Array[i][j] = element;
    }
}

De cette façon, il n'est pas nécessaire de vérifier les valeurs, elles seront toujours égales.

0voto

dquijada Points 422

Cela devrait fonctionner :

import java.util.Scanner;
public class EvenArrayGenerator{
    public static void main(String a[]){
        boolean anyOdd;
        int array = 0;

        do{
            System.out.println ("Array " + ++array + ":");
            anyOdd=false;
            int[][] Array = new int[4][4];
            for(int i=0;i<4;i++) {
                for(int j=0;j<4;j++) {
                    Array[i][j] = (int)(Math.random()*11);
                }
            }

            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    System.out.print(Array[i][j] + " ");
                }
                System.out.println();
            }

            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    anyOdd |= Array[i][j] % 2!=0;
                }
            }

        } while(anyOdd);
    }
}

Comme vous pouvez le voir, j'ai simplement modifié la condition de b a anyOdd Ainsi, s'il y a un nombre impair, il recommencera l'itération.

Vous pouvez également le vérifier lorsque vous générez les nombres aléatoires, ce qui vous permet d'éviter une deuxième boucle :

import java.util.Scanner;
public class EvenArrayGenerator{
    public static void main(String a[]){
        boolean anyOdd;
        int array = 0;

        do{
            System.out.println ("Array " + ++array + ":");
            anyOdd=false;
            int[][] Array = new int[4][4];
            for(int i=0;i<4;i++) {
                for(int j=0;j<4;j++) {
                    Array[i][j] = (int)(Math.random()*11);
                    anyOdd |= array[i][j] % 2 != 0;
                }
            }

            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    System.out.print(Array[i][j] + " ");
                }
                System.out.println();
            }

        } while(anyOdd);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X