¿Hay alguna diferencia entre los resultados de Math.floor(Math.random() * x) + 1 y Math.ceil(Math.random() * x) ?
Math.random() produce valores de punto flotante en el intervalo [0, 1) (de cero inclusive a uno exclusivo ). Esto significa que hay una ligera diferencia entre los dos enfoques:
Math.ceil(Math.random() * x) producirá números enteros en el intervalo [0, x] (desde cero inclusive hasta x inclusive ). Esto se debe a que Math.ceil(0) devolverá un cero. Aunque la posibilidad de conseguir eso es extremadamente pequeña.
function minRandom() { return 0; } function maxRandom() { return 0.9999999; } const x = 10; console.log("min:", Math.ceil(minRandom() * x)); console.log("max:", Math.ceil(maxRandom() * x)); Math.floor(Math.random() * x) + 1 producirá números enteros en el intervalo [1, x] (desde uno inclusive hasta x inclusive ). Esto se debe a que Math.floor(Math.random() * x) produce enteros en el intervalo [0, x-1] (de cero inclusive a x-1 inclusive ).
function minRandom() { return 0; } function maxRandom() { return 0.9999999; } const x = 10; console.log("min:", Math.floor(minRandom() * x) + 1); console.log("max:", Math.floor(maxRandom() * x) + 1);Sí, hay una diferencia.
Existe la posibilidad, aunque muy pequeña , de que la segunda versión devuelva cero inesperadamente.
Esto sucede si Math.random() en sí mismo devuelve exactamente 0.0, lo que legalmente puede hacer.
Sí hay.
...(Math.Random() * 20) - dará resultados entre 0 y 19.99999999999, por lo que en realidad no sube a 20.
...(Math.Random() * 20) + 1 - dará resultados entre 0 y 20.99999999, que en realidad podría incluir 20.