Porcentagem e Random

Galera, a situação é a seguinte; meu código é uma ‘String randomica’ e tudo funciona bem, porem oque eu queria era uma forma de controlar a porcentagem de chance que cada frase tem para aparecer, por exemplo, queria que o triângulo aparecesse mais, quadrado raramente… Esta é a linha de código.
procurei pelo fórum mas não encontrei algo que sanasse completamente minhas dúvidas.

         String[] Formas = {"Bola","Quadrado","Triângulo","Retângulo"};	
	
	 int random = (int) (Math.random()*4);
	 
	 System.out.println(Formas[random]);

Coloca para o random sortear um número maior que a quantidade do array, por exemplo, seis números, depois utiliza if else ou switch para o caso do número ser maior que três dar como resposta um valor específico, assim um dos arrays terá mais chances de ser sorteado do que os outros.

1 curtida

Bom, vc pode usar uma condição.
Algo +/- assim:

import java.util.Random;

public class Guj {

    	public static void main(String[] args) {
    		String[] formas = {"Bola", "Quadrado", "Triângulo", "Retângulo"};
    		Random r = new Random();
    		int num = r.nextInt(10)+1; // gera números entre 1 e 10
    		
    		if(num < 6)
    			System.out.println(formas[2]);
    		else if (num == 6)
    			System.out.println(formas[1]);
    		else if (num > 6 && num <= 8)
    			System.out.println(formas[0]);
    		else
    			System.out.println(formas[3]);
    	}
    }

Mas na minha opinião, esse não é um jeito legal de fazer…
Pode fazer de outra maneira, utilizando um simples controlador:

import java.util.Random;

public class Guj {

	public static void main(String[] args) {
		String[] formas = {"Bola", "Quadrado", "Triângulo", "Retângulo"};
		Random r = new Random();
		int controlador = 0;
		
		for (int i = 0; i < 100; i++) {
			// vou executar essa operação 100x
			controlador = r.nextInt(2)+1; // gera um número entre 1 e 2
			String forma = formas[r.nextInt(3)+1];
			if(controlador == 1 && forma != "Quadrado")
				System.out.println(forma);
			else
				System.out.println(forma);
		}
	}
}

Saída da operação:

Retângulo
Bola
Retângulo
Quadrado
Bola
Bola
Triângulo
Retângulo
Triângulo
Quadrado
Bola
Triângulo
Bola
Quadrado
Bola
Triângulo
Quadrado
Bola
Retângulo
Bola
Quadrado
Triângulo
Quadrado
Quadrado
Quadrado
Retângulo
Bola
Triângulo
Retângulo
Retângulo
Retângulo
Triângulo
Bola
Quadrado
Triângulo
Bola
Quadrado
Retângulo
Quadrado
Bola
Retângulo
Bola
Quadrado
Quadrado
Retângulo
Quadrado
Quadrado
Triângulo
Bola
Bola
Triângulo
Quadrado
Triângulo
Triângulo
Triângulo
Bola
Bola
Triângulo
Bola
Quadrado
Retângulo
Retângulo
Triângulo
Quadrado
Triângulo
Triângulo
Triângulo
Retângulo
Retângulo
Triângulo
Retângulo
Retângulo
Bola
Retângulo
Quadrado
Bola
Triângulo
Triângulo
Quadrado
Quadrado
Retângulo
Bola
Retângulo
Quadrado
Quadrado
Bola
Retângulo
Triângulo
Triângulo
Bola
Triângulo
Bola
Retângulo
Bola
Triângulo
Bola
Triângulo
Triângulo
Retângulo
Bola
1 curtida

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:

  1. Bola
  2. Quadrado
  3. Triângulo
  4. 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:

  1. Bola - 0.15
  2. Quadrado - 0.15
  3. Triângulo - 0.5
  4. 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;
        }
    }
}
3 curtidas

Era exatamente este tipo de porcentagem que eu procurava !!! não achei em lugar nenhum da internet.
Muito obrigado, vai me ajudar muito por aqui.:laughing: