Explicação Math.random ()

133

Esta é uma pergunta Java bastante simples (embora provavelmente aplicável a toda a programação):

Math.random() retorna um número entre zero e um.

Se eu quiser retornar um número inteiro entre zero e cem, faria:

(int) Math.floor(Math.random() * 101)

Entre cem e eu faria:

(int) Math.ceil(Math.random() * 100)

Mas e se eu quisesse obter um número entre três e cinco? Será como a seguinte declaração:

(int) Math.random() * 5 + 3

Eu sei sobre nextInt()em java.lang.util.Random. Mas eu quero aprender como fazer isso Math.random().

Switz
fonte
Para [3,5]:(int)Math.floor(Math.random()*3) + 3
good_evening 1/11/11
9
BTW: o intervalo é de 0,0 inclusivo a 1,0 exclusivo (você nunca receberá 1,0). Usar nextInt () é uma opção muito melhor, não apenas mais simples como também muito mais rápida.
Peter Lawrey
2
O uso Math.ceilestá errado, dá o resultado errado quando Math.random()retorna 0.
Starblue #
E se Math.floor retornar 0,029? Como obter sempre um número de dois dígitos com uma única instrução?
Naisheel Verdhan

Respostas:

165
int randomWithRange(int min, int max)
{
   int range = (max - min) + 1;     
   return (int)(Math.random() * range) + min;
}

Saída de randomWithRange(2, 5)10 vezes:

5
2
3
3
2
4
4
4
5
4

Os limites são inclusivos, ou seja, [2,5] e mindevem ser menores do que maxno exemplo acima.

EDIT: Se alguém ia tentar e ser estúpido e reverter mine max, você poderia alterar o código para:

int randomWithRange(int min, int max)
{
   int range = Math.abs(max - min) + 1;     
   return (int)(Math.random() * range) + (min <= max ? min : max);
}

EDIT2: Para sua pergunta sobre doubles, é apenas:

double randomWithRange(double min, double max)
{
   double range = (max - min);     
   return (Math.random() * range) + min;
}

E, novamente, se você quiser fazer uma prova idiota, é apenas:

double randomWithRange(double min, double max)
{
   double range = Math.abs(max - min);     
   return (Math.random() * range) + (min <= max ? min : max);
}
AusCBloke
fonte
1
E se você não usar (int)e quiser retornar um double?
switz
Se você deseja duplicar, substitua ints por doubles (e a conversão de texto é desnecessária). Presumi que você queria ints, mas vou adicionar ao meu post.
AusCBloke
2
Na verdade, com doubles remova o + 1also, pois Math.random()não está sendo truncado. No entanto, o intervalo será [min, max), pois Math.random"Retorna um valor duplo com um sinal positivo, maior ou igual a 0,0 e menor que 1,0". Haveria uma chance muito mínima de o número ser exatamente de maxqualquer maneira, mesmo que fosse possível.
AusCBloke
44

Se você deseja gerar um número de 0 a 100, seu código ficará assim:

(int)(Math.random() * 101);

Para gerar um número de 10 a 20:

(int)(Math.random() * 11 + 10);

No caso geral:

(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound);

(onde lowerboundé inclusivo e upperboundexclusivo).

A inclusão ou exclusão de upperbounddepende da sua escolha. Digamos range = (upperbound - lowerbound) + 1então upperboundé inclusivo, mas se range = (upperbound - lowerbound), em seguida, upperboundé exclusiva.

Exemplo: Se eu quiser um número inteiro entre 3-5, se o intervalo for (5-3) +1, 5 será inclusivo, mas se o intervalo for apenas (5-3), 5 será exclusivo.

Teezy7
fonte
2
upperboundexclusivo? Eu acho que será inclusivo.
vidit
1
@vidit é exclusivo
1
não acho que você está ficando grande limitesuperior imagem pode ser, conforme previsto no exemplo
Teezy7
19

A Randomclasse de Java localizada no java.utilpacote servirá melhor a seu propósito. Possui alguns nextInt()métodos que retornam um número inteiro. Aquele que usa um argumento int gera um número entre 0 e esse int, o último não inclusivo.

G_H
fonte
Atualizei minha pergunta, gostaria de saber como fazê-lo Math.random(). Obrigado.
switz
1

Para gerar um número entre 10 e 20 inclusive, você pode usar java.util.Random

int myNumber = new Random().nextInt(11) + 10
Ilya Gazman
fonte
0

Aqui está um método que recebe limites e retorna um número inteiro aleatório. É um pouco mais avançado (completamente universal): os limites podem ser positivos e negativos e os limites mínimo / máximo podem ocorrer em qualquer ordem.

int myRand(int i_from, int i_to) {
  return (int)(Math.random() * (Math.abs(i_from - i_to) + 1)) + Math.min(i_from, i_to);
}

Em geral, ele encontra a distância absoluta entre as bordas, obtém um valor aleatório relevante e depois muda a resposta com base na borda inferior.

tolerante a falhas
fonte