Sorteio ponderado

3 respostas
R

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?

3 Respostas

A

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);
		
	}
}
R

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]);
    }
}
M

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…

Criado 28 de janeiro de 2004
Ultima resposta 28 de jan. de 2004
Respostas 3
Participantes 3