JavaRush /Blog Java /Random-ES /Generar un número aleatorio en un rango dado
L2CCCP
Nivel 9

Generar un número aleatorio en un rango dado

Publicado en el grupo Random-ES
Hola al otro lado de la pantalla. Cualquiera de nosotros, tarde o temprano, se enfrenta a la necesidad de generar un número aleatorio en un rango determinado, ya sea un número real o un número entero. Generando un número aleatorio en un rango dado - 1¿Para qué? De hecho, esto no es importante, podría ser una función para calcular la probabilidad de desencadenar algún evento, obtener un multiplicador aleatorio o cualquier otro. Entonces, descubrimos por qué es necesario esto, es decir, para cualquier cosa :) De hecho, existen muchos métodos para obtener un número pseudoaleatorio, pero daré un ejemplo con la clase Math, es decir, el método random(); ¿Que tenemos? Llamar al método Math.random()devuelve un número real pseudoaleatorio ( double) del rango [0;1), es decir, de 0 a 1 excluyendo 1, lo que significa que el número máximo en el rango es 0,99999999999... Bien, tenemos un número pseudoaleatorio, pero ¿Qué pasa si necesitamos nuestra propia gama? Por ejemplo, ¿necesitamos un número pseudoaleatorio del rango [0;100)? Escribimos el código:
public static void main(String... args)
{
	final double max = 100.; // Максимальное число для диапазона от 0 до max
	final double rnd = rnd(max);

	System.out.println("Псевдослучайное вещественное число: " + rnd);
}

/**
 * Метод получения псевдослучайного вещественного числа от 0 до max (исключая max);
 */
public static double rnd(final double max)
{
	return Math.random() * max;
}
No salió mal, pero max(en nuestro caso) todavía no lo conseguiremos. Para obtener un número aleatorio en el rango [0;100] necesitamos sumar max1 al nuestro y luego convertirlo a un número entero como into long(dependiendo de los rangos que usará). Escribimos el código:
public static void main(String... args)
{
	final int max = 100; // Максимальное число для диапазона от 0 до max
	final int rnd = rnd(max);

	System.out.println("Псевдослучайное целое число: " + rnd);
}

/**
 * Метод получения псевдослучайного целого числа от 0 до max (включая max);
 */
public static int rnd(int max)
{
	return (int) (Math.random() * ++max);
}
Nota: Como puede ver, la variable máxima se incrementó en la forma del prefijo. (Si no sabes qué es esto, te aconsejo que leas mi artículo ) Genial, obtuvimos lo que queríamos, pero si necesitamos un rango no desde 0, sino por ejemplo [10;75] Escribimos el código:
public static void main(String... args)
{
	final int min = 10; // Минимальное число для диапазона
	final int max = 75; // Максимальное число для диапазона
	final int rnd = rnd(min, max);

	System.out.println("Псевдослучайное целое число: " + rnd);
}

/**
 * Метод получения псевдослучайного целого числа от min до max (включая max);
 */
public static int rnd(int min, int max)
{
	max -= min;
	return (int) (Math.random() * ++max) + min;
}
Analizando el código del método rnd:

Минимальное число диапазона = 10;
Максимальное число диапазона = 75;
max -= min; // Отнимаем от максимального значения минимальное для получения множителя псевдослучайного вещественного числа.
El número máximo después del cálculo es 65. El número real pseudoaleatorio (por ejemplo) es 0,18283417347179454 (se obtuvo llamando a Math.random()). El número máximo se incrementó con una forma de prefijo antes de la multiplicación. El número máximo ahora es 66. Multiplica 0,18283417347179454 por 66. El resultado de la multiplicación es 12,06705544913844. Convertimos el resultado de multiplicar el número máximo por un número real pseudoaleatorio a tipo entero int. Agregamos el número mínimo al resultado transformado que es igual a 12. Devolvemos el resultado: 22 Como se puede ver en el análisis, incluso si el número real pseudoaleatorio es igual a cero, como resultado devolveremos nuestro mínimo. de sumar nuestro número mínimo con el resultado de la multiplicación. Espero que esto haya sido útil e informativo para usted. Buena suerte dominando Java;) Un par de artículos más: ¿Qué es incrementar y disminuir? El operador de división de módulo.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION