O que você está tentando fazer é algo que pode ser feito pensando em probabilidade/estatística básica. Você quer que tua distribuição de probabilidades discretas não seja uniforme, como é agora.
Teu sample space agora é composto por quatro possíveis eventos:
- Bola
- Quadrado
- Triângulo
- Retângulo
Supondo que o Random do Java é verdadeiramente randômico (não é, mas enfim), a distribuição discreta é uniforme. Em outras palavras, a chance de cada um deles ser sorteado é igual, e é 25% (ou 1 / 4).
Você quer mudar isso, alterar os “pesos” de cada evento, ou mudar a chance de cada um ser sorteado. Ao invés de 0.25 para cada um, podemos ter assim, por exemplo:
- Bola - 0.15
- Quadrado - 0.15
- Triângulo - 0.5
- Retângulo - 0.2
Dessa forma, se você sortear um desses eventos infinitas vezes, 50% delas vai sair Triângulo, 20% vai sair Retângulo e 15% cada um dos outros dois.
Com essa revisão extremamente básica, já dá para entender como funciona o código que faz esse sorteio. Vou fazer algo extremamente procedural para ficar mais fácil de entender, mas com certeza fica bem melhor com orientação a objetos.
Random r = new Random();
String[] possibilidades = {"Bola", "Quadrado", "Triângulo", "Retângulo"};
double[] probabilidades = {0.15, 0.15, 0.5, 0.2};
int sorteios = 10;
for (int i = 0; i < sorteios; i++) {
double total = 0;
double chanceSorteada = r.nextDouble(); // numero entre 0 e 1
for (int j = 0; j < possibilidades.length; j++) {
total += probabilidades[j];
if (chanceSorteada <= total) {
System.out.println(possibilidades[j]);
break;
}
}
}