Gerar double aleatório entre dois números quaisquer [Resolvido]

Olá

Preciso gerar um double aleatório entre 1 e 2. Estou fazendo da seguinte forma:

Math.random() + 1Mas como Math.random() gera números entre 0 inclusive e 1 exclusive, o valor máximo que posso chegar é 1.99999999, e não 2. E eu não posso arredondar.

Grato.

Você pode fazer o seguinte:

Veja a definição matemática de Random.nextDouble. O método que você quer , mas não dá o resultado exato que você quer, é nextDouble (ele gera números aleatórios no intervalo [0.0, 1.0[, não [1.0, 2.0] ) , tanto é que o próprio código-fonte de nextDouble é mostrado no javadoc.

Você pode fazer algumas contas* e fazer o seu próprio nextDouble que gere os números no intervalo [1.0, 2.0].

(acho que em vez de

   return (((long)next(26) << 27) + next(27))
     / (double)(1L << 53);

você teria de usar algo como

return 1.0 + (((long)next(26) << 27) + nextLong (134217729) / (double)(1L << 53); )

A propósito, para todos os efeitos tanto faz se os números estão no intervalo [1.0, 2.0[ (ou seja, simplesmente somando 1.0 ao retorno de nextDouble) ou se estão no intervalo [1.0, 2.0].
É que o valor 2.0 vai ser obtido com a probabilidade de 2 elevado a menos 53, o que daria 1,1102230246251565404236316680908e-16. Ou seja, em termos práticos, não vale a pena você tentar efetuar um sorteio que fique rodando por tanto tempo que você consiga obter o resultado de exatamente 2.0; você teria de fazer pelo menos 2 elevado a 52 (4.503.599.627.370.496) tentativas para ter uma probabilidade razoável de obter o número 2.0 no seu sorteio.

[quote=thingol]A propósito, para todos os efeitos tanto faz se os números estão no intervalo [1.0, 2.0[ (ou seja, simplesmente somando 1.0 ao retorno de nextDouble) ou se estão no intervalo [1.0, 2.0].
É que o valor 2.0 vai ser obtido com a probabilidade de 2 elevado a menos 53, o que daria 1,1102230246251565404236316680908e-16. Ou seja, em termos práticos, não vale a pena você tentar efetuar um sorteio que fique rodando por tanto tempo que você consiga obter o resultado de exatamente 2.0; você teria de fazer pelo menos 2 elevado a 52 (4.503.599.627.370.496) tentativas para ter uma probabilidade razoável de obter o número 2.0 no seu sorteio.
[/quote]
Esse argumento aí matou a pau :smiley: Não tinha pensado por esse lado.

Na linguagem Python tem uma função random.uniform(a, b) que gera um número de ponto flutuante x tal que a <= x <= b.
Que eu saiba. Java não tem uma função semelhante. Como implementá-la?
Se fizermos assim:

Math.random() * x

Podemos gerar um double entre 0 e x.
Mas como gerar um double d tal que a <= d <= b?

Resolvido.

Math.random() * (b - a) + a;

Estava precisando disso tbm.
Vlws