Math.random() retornando 0 [RESOLVIDO]

7 respostas
Luiz_Am_ico

Olá Pessoal,

Estou estudando Java em fase inicial. Gostaria de uma ajuda quanto a um exercício que fiz referente a simulação de um jogo de dado (de seis lados), cujo o mesmo é jogado 10 vezes para exibir o resultado. Minha dúvida é que usei o método random() para gerar os valores aleatórios até o número 6, mas dessa forma aparece 0 (zero) algumas vezes. Como posso evitar que o mesmo apareça? Qualquer idéia é válida.

class Exercicio0401
{
  public static void main (String args[])
  {
    for(int j=1; j<=10; j++)
	  {
	    int dado = (int)(Math.random() * 7);
	    System.out.println("Jogada "+ j +": " + dado);
	  }
	  System.out.println();		
  }
}

Obrigado pela atenção e grande abraço a todos!

Luiz

7 Respostas

JM4X

Amigo, se possivel edite o titulo do seu post. Sempre utilize titulos claros, que especifiquem o proposito do post.

No caso seria um titulo legal: "Math.random() retornando 0"

Quanto a sua duvida, o Math.random() retorna um valor (double) x tal que 0.0 <= x < 1.0.

FONTE: http://download.oracle.com/javase/6/docs/api/java/lang/Math.html#random()

existe uma classe chamada Random. ela tem um metodo que retorna um inteiro de 0 a n-1.

Random r = new Random(); r.nextInt(6); // retorna um valor de 0 a 5
FONTE: http://download.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt(int)

ViniGodoy

A classe Random é bem melhor que o Math.random. Mas se vc fizer questão, basta ler o Javadoc do método random():

Portanto, o número sempre será entre 0 e 1, mas nunca o próprio 1. Logo, se multiplicar o resultado por 7, você terá um número de 0 até quase 6 (trucando para int, de 0 até 6).

Tendo essa certeza, basta fazer:

int dado = (int)(Math.random() * 6); //Sorteia de 0 a 5 dado++; //Agora é um número de 1 até 6

Luiz_Am_ico

Agradeço a sugestão do título e realmente ficou muito melhor da forma que descreveu.
Quanto a classe Ramdom ela retorna um valor de 0 (zero) em diante, porém não gostaria que o “zero” fosse informado.
Ela continua sendo a melhor forma para trabalhar isso?

Grato pela ajuda.

ViniGodoy

Sim, basta somar o valor inicial ao resultado, como eu fiz ali com o Math.random().

Se quiser, pode até montar uma função genérica:

private static Random random = new Random(); public static int sorteia(int nrInicial, int nrFinal) { int sorteio = random.nextInt(nrFinal - nrInicial); //Tamanho do intervalo return sorteio + nrInicial; }

O nrFinal não é incluído no resultado (é uma boa não incluí-lo pois fica fácil sortear índices em listas).

Luiz_Am_ico

Agradeço a dica!
O incremento em dado foi algo que não tinha pensado, veio bem a calhar.
Vou utilizar também sua segunda sugestão para ver como fica no exercício.

Grande abraço,

Valeu mesmo a ajuda.

JM4X

Que bom que solucionou seu problema.

É também uma boa prática no guj, quando o topico for solucionado, adicionar no titulo [RESOLVIDO].

Dessa forma, quando alguém tiver um problema parecido, saberá que a solução está nakele topico.

[] 's

Luiz_Am_ico

Grato e alterado o status para resolvido.

Criado 10 de agosto de 2011
Ultima resposta 10 de ago. de 2011
Respostas 7
Participantes 3