Genera un doble aleatorio en un rango


143

Tengo dos dobles como el siguiente

double min = 100;
double max = 101;

y con un generador aleatorio, necesito crear un valor doble entre el rango de min y max.

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

pero no hay nada aquí donde podamos especificar el rango.

Respuestas:


237

Para generar un valor aleatorio entre rangeMiny rangeMax:

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

21
Esto es generalmente correcto, pero tenga cuidado con sus límites. Si lo hace double rangeMax= Double.MAX_VALUE;y double rangeMin= -rangeMax;siempre obtendrá un valor infinito a cambio. Es posible que desee verificar Double.valueOf(rangeMax-rangeMin).isInfinite().
lre

Tenga en cuenta que los resultados de esto a menudo excluirán muchos valores dobles en el rango deseado, si ese rango es mayor que 0.0-1.0. Si el rango deseado contiene un número mayor de valores que el rango 0.0-1.0, no habrá un valor para cada uno de ellos y nunca se generarán. (¡Por el principio del casillero!). Debido a esto, la solución de Tunaki es mejor.
Lii

@Lii no habrá un valor para cada uno de ellos, ¿ por qué no?
Kartik Chugh

1
@ K_7: Digamos, por ejemplo, que hay 10,000 valores dobles distintos entre 0.0 y 1.0 (en realidad, probablemente haya más). Pero si el rango entre rangeMiny rangeMaxes grande, entonces podría haber 10,000,000 valores dobles distintos entre ellos. El resultado de (rangeMax - rangeMin) * r.nextDouble()solo elegirá entre 10,000 de esos posibles 10,000,000 de valores. (Siento que esta no es una explicación perfecta, pero tal vez ayude un poco ...)
Lii

1
Ah, ya veo. Básicamente, multiplicar un número que puede tomar un conjunto finito de valores no cambia el tamaño de ese conjunto.
Kartik Chugh

138

Esta pregunta se hizo antes del lanzamiento de Java 7, pero ahora, hay otra forma posible de usar la API de Java 7 (y superior):

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

nextDoubledevolverá un valor doble pseudoaleatorio entre el mínimo (inclusivo) y el máximo (exclusivo). Los límites no son necesariamente int, y pueden serlo double.


66
la llamada requiere una API 21
Zar E Ahmer

2
@XarEAhmer ¿Qué es API 21?
Abhijit Sarkar

Parece que se refiere a Android.
Kartik Chugh

40

Utilizar este:

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(): genera aleatoriamente un número entre 0 y 1.

start: número de inicio, para cambiar el número "a la derecha"

end - start: intervalo. Aleatorio le da de 0% a 100% de este número, porque aleatorio le da un número de 0 a 1.


EDITAR 2: Tks @daniel y @aaa bbb. Mi primera respuesta fue incorrecta.


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

La idea principal de random es que devuelve un valor pseudoaleatorio. No existen funciones totalmente aleatorias, por lo tanto, 2 instancias aleatorias que usen la misma semilla devolverán el mismo valor en ciertas condiciones.

Es una buena práctica ver primero el documento de función para comprenderlo ( https://docs.oracle.com/javase/8/docs/api/java/util/Random.html )

Ahora que entendemos que el valor devuelto de la función nextDouble () es un valor pseudoaleatorio entre 0.0 y 1.0, podemos usarlo para nuestro beneficio.

Para crear un número aleatorio entre A y B dando que los límites son válidos (A> B) necesitamos: 1. encontrar el rango entre A y B para que podamos saber cuántos "pasos" tenemos. 2. use la función aleatoria para determinar cuántos pasos tomar (debido a que el valor devuelto está entre 0.0 y 1.0 puede considerarlo como "elegir un porcentaje aleatorio de aumento" 3. agregar el desplazamiento

Después de todo eso, puedes ver que la mafia te dio la forma más fácil y común de hacerlo, en mi opinión.

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.