Gere um duplo aleatório em um intervalo


143

Eu tenho duas duplas como a seguinte

double min = 100;
double max = 101;

e com um gerador aleatório, preciso criar um valor duplo entre o intervalo de min e max.

Random r = new Random();
r.nextDouble();

mas não há nada aqui onde possamos especificar o intervalo.

Respostas:


237

Para gerar um valor aleatório entre rangeMine rangeMax:

Random r = new Random();
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();

21
Isso geralmente está correto, mas cuidado com seus limites. Se você o fizer double rangeMax= Double.MAX_VALUE;e double rangeMin= -rangeMax;sempre obterá um valor infinito em troca. Você pode querer verificar Double.valueOf(rangeMax-rangeMin).isInfinite().
Lre 07/04

Observe que os resultados disso geralmente excluem muitos valores duplos no intervalo desejado, se esse intervalo for maior que 0,0-1,0. Se o intervalo desejado contiver um número maior de valores que o intervalo 0,0-1,0, não haverá um valor para cada um deles e eles nunca serão gerados. (Pelo princípio do buraco de pombo!). Por causa disso, a solução da Tunaki é melhor.
21718 Lii

@Lii não haverá um valor para cada um deles, por que não?
Kartik Chugh

1
@ K_7: Digamos, por exemplo, que haja 10.000 valores duplos distintos entre 0,0 e 1,0 (na realidade, provavelmente existem mais). Mas se o intervalo entre rangeMine rangeMaxfor grande, pode haver 10.000.000 valores duplos distintos entre eles. O resultado de (rangeMax - rangeMin) * r.nextDouble()escolherá apenas entre 10.000 desses 10.000.000 valores possíveis. (Eu sinto que essa não é uma explicação perfeita, mas talvez ajude um pouco ...) #
447

1
Ah entendo. Basicamente, multiplicar um número que pode receber um conjunto finito de valores não altera o tamanho desse conjunto.
Kartik Chugh

138

Esta pergunta foi feita antes do lançamento do Java 7, mas agora existe outra maneira possível de usar a API Java 7 (e acima):

double random = ThreadLocalRandom.current().nextDouble(min, max);

nextDoubleretornará um valor duplo pseudoaleatório entre o mínimo (inclusivo) e o máximo (exclusivo). Os limites não são necessariamente inte podem ser double.


6
A chamada requer API 21
Zar E Ahmer

2
@XarEAhmer O que há de API 21?
Abhijit Sarkar

Parece que ele está se referindo ao Android.
Kartik Chugh

40

Usa isto:

double start = 400;
double end = 402;
double random = new Random().nextDouble();
double result = start + (random * (end - start));
System.out.println(result);

EDITAR:

new Random().nextDouble(): gera aleatoriamente um número entre 0 e 1.

start: número inicial, para mudar o número "para a direita"

end - start: intervalo. Random fornece de 0% a 100% desse número, porque random fornece um número de 0 a 1.


EDIT 2: Tks @daniel e @aaa bbb. Minha primeira resposta estava errada.


4
import java.util.Random;

public class MyClass {
     public static void main(String args[]) {
          Double min = 0.0;  // Set To Your Desired Min Value
          Double max = 10.0; // Set To Your Desired Max Value
          double x = (Math.random() * ((max - min) + 1)) + min;   // This Will Create A Random Number Inbetween Your Min And Max.
          double xrounded = Math.round(x * 100.0) / 100.0;   // Creates Answer To The Nearest 100 th, You Can Modify This To Change How It Rounds.
          System.out.println(xrounded);    // This Will Now Print Out The Rounded, Random Number.
     }
}

0
Random random = new Random();
double percent = 10.0; //10.0%
if (random.nextDouble() * 100D < percent) {
    //do
}

0

A idéia principal do aleatório é que ele retorne um valor pseudo-aleatório. Não existem funções totalmente aleatórias; portanto, 2 instâncias aleatórias que usam a mesma semente retornarão o mesmo valor em determinadas condições.

É uma boa prática visualizar primeiro o documento da função para entendê-lo ( https://docs.oracle.com/javase/8/docs/api/java/util/Random.html )

Agora que entendemos que o valor retornado da função nextDouble () é um valor pseudo-aleatório entre 0,0 e 1,0, podemos usá-lo em nosso benefício.

Para criar um número aleatório entre A e B, indicando que os limites são válidos (A> B), precisamos: 1. encontrar o intervalo entre A e B para que possamos saber quantos "passos" temos. 2. use a função aleatória para determinar quantas etapas executar (como o valor retornado está entre 0,0 e 1,0, você pode pensar nisso como "escolha uma porcentagem aleatória de aumento") 3. adicione o deslocamento

Depois de tudo isso, você pode ver que a multidão lhe deu a maneira mais fácil e comum de fazê-lo na minha opinião

double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble ();

double RandomValue = Offset + (Range) * (randomVal entre 0.0-1.0)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.