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.
Creo que se puede simplificar la matemática un poco. Vamos a crear un multiplicador mínimo y un máximo multiplicador.
Si minInclusive
es menor que (o igual a) multiplier
, entonces sabemos que podemos establecer minMultiplier
a 1
. De lo contrario, es igual al siguiente múltiplo de multiplier
que es mayor que minInclusive
divide multiplier
.
maxInclusive
siempre tiene que ser mayor que (o igual a) multiplier
, por lo que podemos establecer maxMultiplier
a maxInclusive / multiplier
.
A continuación, vamos a multiplicarlo multiplier
por un número aleatorio entre minMultiplier
e 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.