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.