Generar entero aleatorio en el rango múltiple de otro entero en Java

Mikhail Kholodkov:

Estoy luchando para terminar el método de utilidad para generar un número en un rango de 2 enteros que también es un multiplicador de otro entero.

Por ejemplo:

public static void main(String[] args) {
    getIntegerInRangeMultipleOf(100, 1000, 444);
} 

Debe ceder ya sea 444 o 888 . Nada más.

He ocurrió con esta solución:

public static int getIntegerInRangeMultipleOf(int minInclusive, int maxInclusive, int multiplier) {
    return Math.toIntExact(Math.round((Math.random() * (maxInclusive - minInclusive) + minInclusive) / multiplier) * multiplier);
}

Sin embargo, para el ejemplo anterior a veces se produce 0 (cero), además de 444 y 888 .

Para sugerir cómo solucionar la función.

Jacob G.:

Creo que se puede simplificar la matemática un poco. Vamos a crear un multiplicador mínimo y un máximo multiplicador.

Si minInclusivees menor que (o igual a) multiplier, entonces sabemos que podemos establecer minMultipliera 1. De lo contrario, es igual al siguiente múltiplo de multiplierque es mayor que minInclusivedivide multiplier.

maxInclusivesiempre tiene que ser mayor que (o igual a) multiplier, por lo que podemos establecer maxMultipliera maxInclusive / multiplier.

A continuación, vamos a multiplicarlo multiplierpor un número aleatorio entre minMultipliere maxMultiplier, inclusive en ambos extremos:

public static int getIntegerInRangeMultipleOf(int minInclusive, int maxInclusive, int multiplier) {
    int minMultiplier = minInclusive <= multiplier ? 1 : (int) Math.ceil((double) minInclusive / multiplier);
    int maxMultiplier = maxInclusive / multiplier;
    return multiplier * ThreadLocalRandom.current().nextInt(minMultiplier, maxMultiplier + 1);
}

He probado esto con muchas gamas diferentes de números positivos y parece que funciona muy bien.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=236601&siteId=1
Recomendado
Clasificación