rango - Generar números aleatorios entre dos números en JavaScript
numero entero aleatorio javascript (18)
¿Hay una manera de generar un número aleatorio en un rango específico (por ejemplo, de 1 a 6: 1, 2, 3, 4, 5 o 6) en JavaScript?
Math.random()
De la documentación de la Red de Desarrolladores de Math.random() :
// Returns a random integer between min (include) and max (include)
Math.floor(Math.random() * (max - min + 1)) + min;
Ejemplos utiles:
// 0 -> 10
Math.floor(Math.random() * 11);
// 1 -> 10
Math.floor(Math.random() * 10) + 1;
// 5 -> 20
Math.floor(Math.random() * 16) + 5;
// -10 -> (-2)
Math.floor(Math.random() * 9) - 10;
A pesar de muchas respuestas y casi el mismo resultado. Me gustaría añadir mi respuesta y explicar su funcionamiento. Porque es importante entender su funcionamiento en lugar de copiar y pegar un código de línea. Generar números aleatorios no es más que simples matemáticas.
CÓDIGO:
function getR(lower, upper) {
var percent = (Math.random() * 100);
// this will return number between 0-99 because Math.random returns decimal number from 0-0.9929292 something like that
//now you have a percentage, use it find out the number between your INTERVAL :upper-lower
var num = ((percent * (upper - lower) / 100));
//num will now have a number that falls in your INTERVAL simple maths
num += lower;
//add lower to make it fall in your INTERVAL
//but num is still in decimal
//use Math.floor>downward to its nearest integer you won''t get upper value ever
//use Math.ceil>upward to its nearest integer upper value is possible
//Math.round>to its nearest integer 2.4>2 2.5>3 both lower and upper value possible
console.log(Math.floor(num), Math.ceil(num), Math.round(num));
}
Ejemplo
Devuelve un número aleatorio entre 1 y 10:
Math.floor((Math.random() * 10) + 1);
El resultado podría ser: 3
Pruébate: here
-
o utilizando lodash / undescore:
_.random(min, max)
Docs: - lodash.com/docs#random - Underscore
En lugar de Math.random()
, puede usar crypto.getRandomValues()
para generar números aleatorios criptográficamente seguros distribuidos uniformemente. Aquí hay un ejemplo:
function randInt(min, max) {
var MAX_UINT32 = 0xFFFFFFFF;
var range = max - min;
if (!(range <= MAX_UINT32)) {
throw new Error(
"Range of " + range + " covering " + min + " to " + max + " is > " +
MAX_UINT32 + ".");
} else if (min === max) {
return min;
} else if (!(max > min)) {
throw new Error("max (" + max + ") must be >= min (" + min + ").");
}
// We need to cut off values greater than this to avoid bias in distribution
// over the range.
var maxUnbiased = MAX_UINT32 - ((MAX_UINT32 + 1) % (range + 1));
var rand;
do {
rand = crypto.getRandomValues(new Uint32Array(1))[0];
} while (rand > maxUnbiased);
var offset = rand % (range + 1);
return min + offset;
}
console.log(randInt(-8, 8)); // -2
console.log(randInt(0, 0)); // 0
console.log(randInt(0, 0xFFFFFFFF)); // 944450079
console.log(randInt(-1, 0xFFFFFFFF));
// Uncaught Error: Range of 4294967296 covering -1 to 4294967295 is > 4294967295.
console.log(new Array(24).fill().map(n => randInt(8, 12)));
// [11, 8, 8, 11, 10, 8, 8, 12, 12, 12, 9, 9,
// 11, 8, 11, 8, 8, 8, 11, 9, 10, 12, 9, 11]
console.log(randInt(10, 8));
// Uncaught Error: max (8) must be >= min (10).
Encontré que la solución de Francisc de arriba no incluía el número mínimo o máximo en los resultados, así que lo modifiqué así:
function randomInt(min,max)
{
return Math.floor(Math.random()*(max-(min+1))+(min+1));
}
Escribí una función más flexible que puede darte un número aleatorio pero no solo un número entero.
function rand(min,max,interval)
{
if (typeof(interval)===''undefined'') interval = 1;
var r = Math.floor(Math.random()*(max-min+interval)/interval);
return r*interval+min;
}
var a = rand(0,10); //can be 0, 1, 2 (...) 9, 10
var b = rand(4,6,0.1); //can be 4.0, 4.1, 4.2 (...) 5.9, 6.0
Versión fija.
Estaba buscando un generador de números aleatorios escrito en TypeScript y escribí esto después de leer todas las respuestas, espero que funcione para los codificadores de TypeScript.
Rand(min: number, max: number): number {
return (Math.random() * (max - min + 1) | 0) + min;
}
Las matemáticas no son mi punto fuerte, pero he estado trabajando en un proyecto en el que necesitaba generar muchos números aleatorios entre positivo y negativo.
function randomBetween(min, max) {
if (min < 0) {
return min + Math.random() * (Math.abs(min)+max);
}else {
return min + Math.random() * max;
}
}
P.ej
randomBetween(-10,15)//or..
randomBetween(10,20)//or...
randomBetween(-200,-100)
Por supuesto, también puede agregar alguna validación para asegurarse de no hacer esto con nada más que números. También asegúrese de que min sea siempre menor o igual que max.
O, en el Underscore
_.random(min, max)
Otras soluciones:
-
(Math.random() * 6 | 0) + 1
-
~~(Math.random() * 6) + 1
Para crear un número aleatorio en javascript podemos usar el objeto Math
incorporado en javascript. El objeto Math
tiene una función Math.random()
. Esta función hace lo siguiente (fuente MDN):
La función Math.random () devuelve un número pseudoaleatorio de punto flotante en el rango 0–1 (incluido 0, pero no 1) con una distribución aproximadamente uniforme en ese rango, que puede escalar al rango deseado.
Dada esta funcionalidad, podemos escalar esto fácilmente en escenarios más complejos. Por ejemplo:
function randomNR (x, y){
return Math.round((Math.random() * x + y));
}
// dice >> random number between 1-6
// dice functionality without function >> Math.round((Math.random() * 5 + 1))
console.log(randomNR(5,1));
// coin >> random number between 0-1
// coin functionality without function >> Math.round((Math.random() * 1))
console.log(randomNR(1,0))
Si quisieras obtener entre 1 y 6, calcularías:
Math.floor(Math.random() * 6) + 1
Dónde:
- 1 es el número de inicio
- 6 es el número de resultados posibles (1 + inicio (6) - final (1) )
Siente que necesitas sumar 1 al número máximo, y luego restar el número mínimo para que funcione todo esto, y necesito hacer muchos enteros aleatorios, esta función funciona.
var random = function(max, min) {
high++;
return Math.floor((Math.random()) * (max - min)) + min;
};
Esto funciona con números negativos y positivos, y estoy trabajando en decimales para una biblioteca.
jsfiddle: https://jsfiddle.net/cyGwf/477/
Entero aleatorio : para obtener un entero aleatorio entre min
y max
, use el siguiente código
function getRandomInteger(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min;
}
Número de punto flotante aleatorio : para obtener un número de punto flotante aleatorio entre min
y max
, use el siguiente código
function getRandomFloat(min, max) {
return Math.random() * (max - min) + min;
}
Referencia: Math.random()
TL; DR
function generateRandomInteger(min, max) {
return Math.floor(min + Math.random()*(max + 1 - min))
}
Para obtener el número aleatorio generateRandomInteger(-20, 20);
EXPLICACION ABAJO
Necesitamos obtener un entero aleatorio, digamos X entre mín y máx.
¿Derecha?
es decir, min <= X <= max
Si restamos min de la ecuación, esto es equivalente a
0 <= (X - min) <= (max - min)
Ahora, vamos a multiplicar esto con un número aleatorio r que es
0 <= (X - min) * r <= (max - min) * r
Ahora, vamos a agregar min a la ecuación
min <= min + (X - min) * r <= min + (max - min) * r
Ahora, vamos a elegir una función que dé como resultado que r satisfaga nuestro rango de ecuación como [min, max]. Esto solo es posible si 0 <= r <= 1
DE ACUERDO. Ahora, el rango de r, es decir, [0,1] es muy similar al resultado de la función Math.random (). ¿No es así?
La función Math.random () devuelve un número pseudoaleatorio de punto flotante en el rango [0, 1); es decir, desde 0 (inclusive) hasta pero sin incluir 1 (exclusivo)
Por ejemplo,
Caso r = 0
min
+ 0 * ( max
- min
) = min
Caso r = 1
min
+ 1 * ( max
- min
) = max
Caso aleatorio usando Math.random 0 <= r <1
min
+ r * ( max
- min
) = X , donde X tiene un rango de min <= X < max
El resultado anterior X es un número aleatorio. Sin embargo, debido a Math.random () nuestro límite izquierdo es inclusivo, y el límite derecho es exclusivo. Para incluir nuestro límite derecho, aumentamos el límite derecho en 1 y reducimos el resultado.
function generateRandomInteger(min, max) {
return Math.floor(min + Math.random()*(max + 1 - min))
}
Para obtener el numero aleatorio
generateRandomInteger(-20, 20)
;
function random(min, max){
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function randomIntFromInterval(min,max) // min and max included
{
return Math.floor(Math.random()*(max-min+1)+min);
}
Lo que hace "extra" es que permite intervalos aleatorios que no comienzan con 1. Así que puedes obtener un número aleatorio de 10 a 15, por ejemplo. Flexibilidad.
var x = 6; // can be any number
var rand = Math.floor(Math.random()*x) + 1;