[RESOLVIDO]Preencher array

13 respostas
J

Bom preciso preencher um array com números…
Info:

  1. nv1 = new Casa[tamanho];
  2. Casa possui dois inteiros (sorteio, nível(que é definido));
  3. Os números que devem entrar no array são a quantidade de jogadores, int quantJogador = tamanho/3;;
  4. Cada número deve aparecer 3x no Array, nem mais nem menos.
  5. Os números devem ser sorteados aleatóriamente.

Exemplo:
2 jogadores = 6 posições, o array deve conter 3 posições com 1 e 3 posições com 2, aleatóriamente, 1 - 2 - 1 - 1 - 2 - 2.

O que eu fiz, ele sorteia, só precisa “ver” se ja tem 3 números iguais, se tiver ele vai pular e vai apontar pra null e vai receber outro número, caso esse número ja tenha vai ficar sorteando até ter um número que possa…

for(int i = 0; i < nv1.length;i++){ do{ sorteio = 1 + (int)(Math.random() *quantJogador); nv1[i] = new Casa(sorteio,1); }while(nv1[i] == null); }

13 Respostas

nel

Eu preciso tirar férias, e agora? :frowning:
rs…

Brincadeiras a parte, colega, qual a sua dúvida? O seu algoritmo está gerando exceção?

J

nel:
Eu preciso tirar férias, e agora? :frowning:
rs…

Brincadeiras a parte, colega, qual a sua dúvida? O seu algoritmo está gerando exceção?

Não é bem uma dúvida, é mais uma falta de conhecimento, preciso preencher o array com 3 números de cada e aleatóriamente, o que eu fiz foi preencher aleatóriamente, mais preciso que só entre 3x cada número, e o que eu fiz pode entrar 10x o mesmo…

J

Não sei se existe alguma maneira de fazer um math.random que sorteia só 3x um mesmo número… ou sei la se tiver outra idéia…

J

UP.
Preciso disso pra acabar um trabalho, por favor alguem ajuda.

asousaj

Cara,
Antes de adicionar ao ‘nv1’ verifica se o mesmo já não possui 3 posições com o valor q está a adicionar, se já tiver sorteia novamente.

Atenção só use o q eu escrevi se não achar outro metodo, pois nem pensei muito e de cara acho pouco eficiente(já que alguns sorteios serão descartados).

F

Amigo se compreendi bem sua logica… o que vc vai precisar fazer é dois random… no primeiro random vc sorteia o numero que precisa guarda no array, em seguida vc faz outro random(no caso do exemplo acima vc teria q fazer esse random 3 vezes) nesse caso para sortea as posiçoes do array, em que vai guarda o numero sorteado no primeiro random

Entao em alto nivel seria assim:

1° random numero q vai ser guardado x = 1 por exemplo;
2° random executado 3 vezes sairia por exemplo y = 0 , 2 , 5

seu array de tamanho 6 final ficaria assim {1,-,1,-,-,1,-} veja bem as poisçoes com “-” sao as ainda n preenchidas

espero ter ajudado abraço

J

Fernando Trindade:
Amigo se compreendi bem sua logica… o que vc vai precisar fazer é dois random… no primeiro random vc sorteia o numero que precisa guarda no array, em seguida vc faz outro random(no caso do exemplo acima vc teria q fazer esse random 3 vezes) nesse caso para sortea as posiçoes do array, em que vai guarda o numero sorteado no primeiro random

Entao em alto nivel seria assim:

1° random numero q vai ser guardado x = 1 por exemplo;
2° random executado 3 vezes sairia por exemplo y = 0 , 2 , 5

seu array de tamanho 6 final ficaria assim {1,-,1,-,-,1,-} veja bem as poisçoes com “-” sao as ainda n preenchidas

espero ter ajudado abraço

Acho que não precisaria sortear as posições do array, só precisaria controlar que so fosse sorteado 3x um mesmo número.
Tipo:
posições do array:
0-1-2-3-4
1-2-1-1-"1"Não pode ja tem 3x o número 1, posição 4 recebe outro número != 1.

F

amigo se o valor sorteado deve se guardado no array em posiçoes aleatorias… creio q seria uma boa ideia vc fazer outro random pra sortea aleatoriamente onde sera guardado o numero sorteado

J

Hmm pensei melhor acho que voce tem razão, assim eu poderia controlar, fazer um FOR pra percorrer de 1 até quantJogador, e guardar em 3 posições o mesmo número !
int sorteio = 0;

for(int i = 1; i < quantJogador && ; i++){ sorteio = (int)(Math.random() *tamanho); nv1[sorteio] = i; sorteio = (int)(Math.random() *tamanho); nv1[sorteio] = i; sorteio = (int)(Math.random() *tamanho); nv1[sorteio] = i; }

Isso faria com que sorteie a posição e coloque o i, porém como vou fazer pra saber se a posiçao “sorteio” já não está sendo usada ?
Digamos que o primeiro sorteio desse 0.
A posição 0 do array ia ter 1.
E se o segundo sorteio desse 0.
A posição 0 do array ia ter 1, e faltaria uma posição com o número 1…
Conseguiu entender ?

asousaj

Assim funciona, testei, não sei se é a melhor opção.

int quantJogador = 3;	// chutei 3 para teste
Casa[] nv1 = new Casa[quantJogador * 3];	//considerando 3 casas para cada jogador
int[] ocorrencias = new int[quantJogador];	//contador para a quantidade de casas sortedas para cada jogador
int sorteio;
for (int i = 0; i < nv1.length; i++) {
	do {
		sorteio = 1 + (int) (Math.random() * quantJogador);
		if (ocorrencias[sorteio - 1] < 3) { //checando se esse jogador  está em 3 casas
			nv1[i] = new Casa(sorteio, 1); // se não adiciona
			ocorrencias[sorteio - 1]++; // e incrementa contador dele
		}
	} while (nv1[i] == null);
}

Testa ai

J

compilou...
pra imprimir pra testar seria assim ?

public void imprimeCenario(){
        for(int i = 0; i < nv1.length; i++)
            System.out.print(nv1[i].getId());
    }

quando eu executo o imprimeCenario da erro, nullPointer...

levando em conta que a Class Casa é essa
id é o número ( de 1 a quantJogador )
e nível é definido em 1.

public class Casa {
    private int id, nivel;
    
    public Casa(int id, int nivel) {
        this.id = id;
        this.nivel = nivel;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getNivel() {
        return nivel;
    }

    public void setNivel(int nivel) {
        this.nivel = nivel;
    }    
}
J

CONSEGUI !!!
Obrigado por tudo mano !

asousaj

Blz Javaorg, marca então [ resolvido] no titulo do topico.

Criado 1 de dezembro de 2011
Ultima resposta 1 de dez. de 2011
Respostas 13
Participantes 4