Sobre a repetição de numeros aleatorios

12 respostas
E

Ola sou novo por aqui e com java, e ao dar uma gugada em minhas duvidas vi que voces conseguem realmente sanar as duvidas do pessoal,
gostaria pedir ajuda com isso que estou fazendo, é assim estou tenatnbdo fazer um campo minado, o meu problma é que eu gero os numeros aleatorios normamente
em um vetor mais queria que esse numeros não saissem repetidos, pq no caso cada numero é um aposição do vetor,
e caso tenho duas seria duas posições assim na horade colocar as bomba vai dar problmea será que vcs conseguem me ajuda.

[/code]
import java.util.Random;
import java.util.Scanner;

public class CampoMinado
{
public static void main (String [] arg){

System.out.println ("Por Favor digite o tamanho do tabuleiro e o nuemro de bombas");
Scanner entrada = new Scanner (System.in);
int n = entrada.nextInt ();
int b = entrada.nextInt ();
int [] caminho = new int[n]; // vetor na qual será armazenado as bombas ou não
int [] caminhoj = new int [n];
Random r = new Random ();
int t=b;
for (int i = 0; i < caminho.length; i++){
caminho [i] = 1 + (int)(Math.random() * n);
//verificar se os numeros aleatorios estao sendo repetidos
for (int j = 0; j <= i; j++){
while (caminho [i] == caminhoj [j])
caminho [i] = 1 + (int)(Math.random() * n);
}
// if (caminho [i] == caminho [j]){
// i = i + 1;
// }
System.out.println ("Tabuleiro [" + caminho [i] + "]");
while ( i < t ){
i = i +1;
caminho [i] = 1 + (int)(Math.random() * b);
if (t != n)
System.out.println ("Bombas [" + caminho [i] + "] = -1");
else
System.out.println ("Não Tem Bombas [" + caminho [i] + "] = 0");

}
}
}
}
[code]

12 Respostas

rmendes08

Cara, você inverteu as tags de code.

rmendes08

Outra dica, já que outras pessoas lerão o seu código ajude-as nomeando melhor suas variáveis. Por exemplo, ao invés de n, j, b você pode utilizar tamanhoTabuleiro, numeroBombas,etc. Assim fica bem mais fácil de entender o que você pretende com o seu código.

davidbuzatto

Um tabuleiro não é uma matriz?
Não é mais fácil inicializar tudo e depois embaralhar?

int larguraTabuleiro = 10;
int alturaTabuleiro = 10;
int quantidadeBombas = 25;
int bombasInstaladas = 0;

boolean[][] tabuleiro = new boolean[alturaTabuleiro][larguraTabuleiro];

// instala as bombas
for ( int i = 0; i < tabuleiro.length; i++ ) {
    for ( int j = 0; j < tabuleiro[i].length; j++ ) {
        if ( bombasInstaladas < quantidadeBombas ) {
            tabuleiro[i][j] = true;
            bombasInstaladas++;
        }
    }
}

// embaralha, trocando os valores baseado em posições aleatórias
for ( int i = 0; i < tabuleiro.length; i++ ) {
    for ( int j = 0; j < tabuleiro[i].length; j++ ) {
        int xr = (int) ( Math.random() * ( alturaTabuleiro ) );
        int yr = (int) ( Math.random() * ( larguraTabuleiro ) );
        boolean temp = tabuleiro[i][j];
        tabuleiro[i][j] = tabuleiro[xr][yr];
        tabuleiro[xr][yr] = temp;
    }
}

// mostrando
for ( int i = 0; i < tabuleiro.length; i++ ) {
    for ( int j = 0; j < tabuleiro[i].length; j++ ) {
        System.out.print( tabuleiro[i][j] + ", " );
    }
    System.out.println();
}

Acho que o código acima explica a si mesmo. Olhe só como usar variáveis com nomes relevantes ajuda o desenvolvimento.

[]´s

rmendes08

Eu estava brincando um pouco com esse campo minado, e realmente, é bem melhor embaralhar depois. Fica mais fácil, e não há risco de loop infinito.

davidbuzatto

Ao invés de embaralhar toda a matriz, pode-se também usar uma lógica parecida com a da “instalação das minas”, ou seja, percorrer somente os elementos que foram inicializados com true e trocar seus valores.

[]´s

E

Eu agrdeço as resposta, mas eu tenho que seguir algumas regras em que meu professor pré definiu por isso estou usando o vetor em vez da matris,
o meu problmea em questao é sóbre os numeros aleatoriso que estao repetindo e ninguem falou nada sobre isso, gostaria de saber se alguem sabve algo, do mesmo
desde ja muito obrigado.

davidbuzatto

Onde está havendo a repetição?
Ou seu professor gosta de complicar ou não viu uma solução mais simples para o problema.

E

Eles gosta de complica, quando sortei os numeors para dentro do vetor acaba surgindo nuemros iguais, isso ta ferrando, quando o usurio digita por exemplo um n= 10, cai 2 3 ou 5 por exemplo, e deveria cair só nuemros distintos.

davidbuzatto

Me explica uma coisa. Para quer serve o n?
Tem como vc me passar o algoritmo que você está tentando usar?
Seu código está um pouco confuso…

E

Tipo o n é o tamnho do vetor, b o nuemro de bombas, eu vou prencher o vetor com nuemros aleatorios que não se petem, assim, posso colocar as bombas nas casas que tenha sempre numeros distintos uma da outra, mais o problmea é esse os nuemros aleatoris não saem distintos.

davidbuzatto

Preencha o array com números e embaralhe ele como fiz com a matriz.
Resolve seu problema.

E

Eu agradeço mais como disse sou iniciante e estou procurando soluções eu até entendi o que vc disse, mais não sei aplicar,
tem como da uma ajuda e por favor coloque uma explicação pra mim entender por completo.Obrigado

Criado 19 de setembro de 2009
Ultima resposta 20 de set. de 2009
Respostas 12
Participantes 3