Olá,
Alguém sabe se é possível fazer o seguinte: tenho três possibilidades:
A - 10%
B - 40%
C - 50%
Como fazer o sorteio entre estes três de forma a manter essas chances?
Olá,
Alguém sabe se é possível fazer o seguinte: tenho três possibilidades:
A - 10%
B - 40%
C - 50%
Como fazer o sorteio entre estes três de forma a manter essas chances?
Bom dia Roberto,
Achei interessante o problema que você sugeriu no forum e resolvi lhe ajudar. Fiz um programinha simples que demonstra como sortear três ou mais Cartas( apenas como exemplo ) dada uma porcentagem para cada tipo de carta.
Segue o exemplo abaixo, qualquer dúvida só entrar em contato.
/*
* Created on 28/01/2004
*
*/
/**
* @author diego
*
*/
public class Sorteio {
// Porcentagem que cada um deve aparecer
private final int A = 10;
private final int B = 40;
private final int C = 50;
private final int TOTAL = A + B + C;
// Armazena as cartas
private char[] baralho;
public Sorteio() {
baralho = new char[TOTAL];
montarBaralho();
embaralhar();
}
/* Preenche o baralho com a quantidade ideal de cartas */
private void montarBaralho() {
for (int i = 0; i < TOTAL; i++) {
if (i < A) {
baralho[i] = 'A';
} else if (i < B) {
baralho[i] = 'B';
} else {
baralho[i] = 'C';
}
}
}
// Embaralha o monte utilizando um algoritimo simples
public void embaralhar() {
for (int i = 0; i < TOTAL; i++) {
int posicao = (int) (Math.random() * TOTAL);
char cartaAnterior = baralho[posicao];
baralho[posicao] = baralho[i];
baralho[i] = cartaAnterior;
}
}
// Retorna uma carta aleatória do baralho
public char getCarta() {
int rand = (int) (Math.random() * TOTAL);
return baralho[rand];
}
// Uma demonstração de como pode ser utilizado os objetos desta classe
public static void main(String[] args) {
Sorteio sorteio = new Sorteio();
int numA = 0;
int numB = 0;
int numC = 0;
for (int i = 0; i < 100; i++) {
char carta = sorteio.getCarta();
switch (carta) {
case 'A':
++numA;
break;
case 'B':
++numB;
break;
case 'C':
++numC;
break;
}
}
System.out.println("Estatisticas do Sorteio: ");
System.out.println("A = " + numA);
System.out.println("B = " + numB);
System.out.println("C = " + numC);
}
}
Cara, legal, funcionou tranquilo.
Extendi seu algoritmo e fiz uma classe com um método estático.
public class ponderateRandom {
/** Creates a new instance of ponderateRandom */
public ponderateRandom() {
}
/**o vetor possib deve ser da seguinte forma:
* índice: identificador externo
* valor: probabilidade
*/
public static int sort(int[] possib) {
int total = 0;
for (int i=0; i<possib.length; i++)
total += possib[i];
//monta vetor
int[] pilhadesorteio = new int[total];
int ponteiro = 0;
int prob = possib[0];
for (int i=0; i<total; i++) {
if (prob < i) {
ponteiro ++;
prob += possib[ponteiro];
}
pilhadesorteio[i] = ponteiro;
}
//Embaralha o vetor
int anterior = 0;
int posicao = 0;
for (int i=0; i<total; i++) {
posicao = (int)(Math.random()*total);
anterior = pilhadesorteio[posicao];
pilhadesorteio[posicao] = pilhadesorteio[i];
pilhadesorteio[i] = anterior;
}
//Retorna um valor qualquer:
int iout = (int)(Math.random()*total);
return(pilhadesorteio[iout]);
}
}
Muito interessante o programa feito pelo nosso colega, mas se precisar de uma solucao mais simples:
int sorteio=random.nextInt(100);
if(sorteio<10)
{
// probabilidade 10% correto?
}
if(sorteio>9 && sorteio <50)
{
//probabilidade 40%
}
if(sorteio>49)
{
//probabilidade 50%
}
Ate mais…