[RESOLVIDO] Gerar 10 números aleatórios entre 1 e 20 sendo que 5 sejam pares e 5 ímpares

Preciso gerar uma lista de 10 números aleatórios entre 1 e 20, sendo que 5 números precisam ser pares e 5 ímpares. Consegui gerar 10 números aleatórios dos 20, mas não estou conseguindo fazer com que imprima apenas 5 pares e 5 ímpares na mesma linha.

List<Integer> lista = new ArrayList<Integer>();
    int numero;

    while (lista.size() < 10) {
        numero = 1 + (int) (Math.random() * 20);
        if (!lista.contains(numero)) {
            lista.add(numero);
        }
    }

    for (Integer n : lista) {
        System.out.print(n + " ");
    }

Para descobrir se o número é par, basta utilizar:
n % 2 == 0

Pegamos o resto da divisão de n por 2 e comparamos se é 0.
Se retornar true é par, se retornar false é ímpar :wink:

Quando a isso tranquilo, não estou conseguindo fazer com que ele imprima 5 ímpares e 5 pares.
Ajustei o código abaixo, mas ele só imprime par (meio óbvio pq adicionei o if que verifica se é divisível por 2). Como faço para ele imprimir 5 ímpares, além de 5 pares?

List<Integer> lista = new ArrayList<Integer>();
    int numero;

    while (lista.size() < 10) {
        numero = 1 + (int) (Math.random() * 20);
        if (numero % 2 == 0) {
            if (!lista.contains(numero)) {
                lista.add(numero);
            }
        }
    }

    for (Integer n : lista) {
        System.out.print(n + " ");
    }

Assim ele até mostra, mas não da forma bem correta, as vezes aparecem 6 pares e 4 impares, ou ao contrário.

List<Integer> lista = new ArrayList<Integer>();
    int numero;

    while (lista.size() < 10) {
        numero = 1 + (int) (Math.random() * 20);
        if (numero % 2 == 0) {
            if (!lista.contains(numero)) {
                lista.add(numero);
            }
        }else{
            if (!lista.contains(numero)) {
                lista.add(numero);
            }
        }
    }
    
    for (Integer n : lista) {
        System.out.print(n + " ");
    }

Como eu faria

public static void main(String[] args) {
    List<Integer> par = Arrays.asList(2, 4, 6, 8, 10, 12, 14, 16, 18, 20);  //numeros pares possíveis, podia ser inicializado com o for
    List<Integer> impar = Arrays.asList(1, 3, 5, 7, 9, 11, 13, 15, 17, 19); // numeros impares possíveis, podia ser inicializado com o for
    Collections.shuffle(par); // Embaralha pares
    Collections.shuffle(impar); // Embaralha impares

    List<Integer> resultado = new ArrayList<>(par.subList(0, 5)); // Obtem 5 pares da lista embaralhada de pares
    resultado.addAll(impar.subList(0, 5)); // Obtem 5 impares da lista embaralhada de impares
    Collections.shuffle(resultado); // Embaralha o resultado (senão seriam sempre 5 pares seguidos de 5 impares)

    resultado.forEach(System.out::println); //Imprime os valores

}

Como teu professor deve querer

public static void main(String[] args) {
   List<Integer> lista = new ArrayList<Integer>();
   int pares = 0;
   int impares = 0;
   int max = 5;

   while (lista.size() < 10) {
      int numero = 1 + (int) (Math.random() * 20);

      if (!lista.contains(numero)) {
         if (numero%2==0 && pares<max) { //so adiciona se numero for par e ainda nao estiverem todos os pares adicionados
           lista.add(numero);
           pares++;
         } else if (numero%2!=0 && impares<max) { //so adiciona se numero for impar e ainda nao estiverem todos os impares adicionados
           lista.add(numero);
           impares++;
         }
     }
   }

   for (Integer n : lista) {
      System.out.print(n + " ");
    }

Muito obrigada @pmlm :slight_smile:

Existem N maneiras de implementar, segue outro exemplo:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Exemplo {

    public static void main(String[] args) {
        Exemplo programa = new Exemplo();
        programa.executar();
    }

    private List<Integer> pares = new ArrayList<>();
    private List<Integer> impares = new ArrayList<>();

    Exemplo() {
        for (int numero = 2; numero <= 20; numero += 2) {
            pares.add(numero);
        }

        for (int numero = 1; numero < 20; numero += 2) {
            impares.add(numero);
        }
    }

    public void executar() {
        System.out.println("Sorteando 5 numeros pares:");
        for (int i = 0; i < 5; i++) {
            System.out.println(sortear(pares));
        }

        System.out.println("Sorteando 5 numeros impares:");
        for (int i = 0; i < 5; i++) {
            System.out.println(sortear(impares));
        }
    }

    private int sortear(List<Integer> numeros) {
        int sorteado = new Random().nextInt(numeros.size());
        return numeros.remove(sorteado);
    }
}