Cartas Aleatórias em JAVA?

Olá, sou iniciante em JAVA e estou querendo desenvolver um joguinho de cartas, mas antes estou fazendo alguns testes e estudos relacionados a geração de números aleatórios e probabilidade.
No teste que estou fazendo eu quero que o computador “puxe” uma carta de um baralho de 32 cartas de 5 tipos diferentes(a, b, c, d, e) , sendo que no baralho há 10 cartas do tipo “a”, 8 cartas do tipo “b”, “6” cartas do tipo “c”, 4 cartas do tipo “d” e 4 do tipo “e”. A minha dificuldade está sendo a probabilidade do computador de tirar uma determinada carta, por exemplo, como há mais cartas do tipo “a” o computador tem mais chances de tirar esse tipo, porém, depois de tirada a carta a probabilidade muda, como eu poderia fazer pra ele sempre tirar uma carta com chances reais e de forma aleatória de acordo com a quantidade de cada tipo?

Eu criaria uma classe Carta:

public class Carta {

    public final char tipo;
    public final int numero;

    public Carta(char tipo, int numero) {
        this.tipo = tipo;
        this.numero = numero;
    }

    @Override
    public String toString() {
        return "Carta " + tipo + " " + numero;
    }
}

Uma classe Baralho:

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

public class Baralho {

    private final List<Carta> cartas = new ArrayList<>();

    public void adicionar(Carta... cartas) {
        this.cartas.addAll(Arrays.asList(cartas));
    }

    public Carta sortear() {
        if (cartas.isEmpty()) {
            throw new IllegalStateException("Baralho vazio!");
        }
        int limite = cartas.size();
        int posicao = new Random().nextInt(limite);
        Carta sorteada = cartas.remove(posicao);
        return sorteada;
    }

    public boolean vazio() {
        return cartas.isEmpty();
    }
}

E executaria mais ou menos assim:

public class Exemplo {

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

    public void executar() {
        Baralho baralho = criarBaralho();
        int contador = 0;
        while (!baralho.vazio()) {
            contador++;
            Carta sorteada = baralho.sortear();
            System.out.println(contador + ": " + sorteada);
        }
    }

    private Baralho criarBaralho() {
        Baralho baralho = new Baralho();
        baralho.adicionar(criarCartas(10, 'a'));
        baralho.adicionar(criarCartas(8, 'b'));
        baralho.adicionar(criarCartas(6, 'c'));
        baralho.adicionar(criarCartas(4, 'd'));
        baralho.adicionar(criarCartas(4, 'e'));
        return baralho;
    }

    private Carta[] criarCartas(int quantidade, char tipo) {
        Carta[] cartas = new Carta[quantidade];
        for (int i = 0; i < quantidade; i++) {
            cartas[i] = new Carta(tipo, (i + 1));
        }
        return cartas;
    }
}

Muito obrigado pela sua ajuda, consegui compreender o seu código e resolver o problema, VLW!!!

1 curtida