Pregunta ¿Generando números enteros aleatorios en JavaScript en un rango específico?


¿Cómo puedo generar un número entero aleatorio entre dos variables específicas en Javascript, p. Ej. x = 4 y y = 8 produciría cualquiera de 4, 5, 6, 7, 8?


1484
2017-10-06 20:05


origen


Respuestas:


Hay algunos ejemplos en Red de desarrolladores Mozilla página:

/**
 * Returns a random number between min (inclusive) and max (exclusive)
 */
function getRandomArbitrary(min, max) {
    return Math.random() * (max - min) + min;
}

/**
 * Returns a random integer between min (inclusive) and max (inclusive)
 * Using Math.round() will give you a non-uniform distribution!
 */
function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

Aquí está la lógica detrás de esto. Es una regla simple de tres:

Math.random() devuelve un Number entre 0 (inclusive) y 1 (exclusivo). Entonces tenemos un intervalo como este:

[0 .................................... 1)

Ahora, nos gustaría un número entre min (inclusive) y max (exclusivo):

[0 .................................... 1)
[min .................................. max)

Podemos usar el Math.random para obtener el corresponsal en el intervalo [min, max). Pero, primero debemos factorizar un poco el problema restando min desde el segundo intervalo:

[0 .................................... 1)
[min - min ............................ max - min)

Esto da:

[0 .................................... 1)
[0 .................................... max - min)

Ahora podemos aplicar Math.random y luego calcule el corresponsal. Vamos a elegir un número al azar:

                Math.random()
                    |
[0 .................................... 1)
[0 .................................... max - min)
                    |
                    x (what we need)

Entonces, para encontrar x, haríamos:

x = Math.random() * (max - min);

No te olvides de agregar min de vuelta, para que obtengamos un número en el intervalo [mín., máx.]:

x = Math.random() * (max - min) + min;

Esa fue la primera función de MDN. El segundo, devuelve un número entero entre min y max, ambos inclusive.

Ahora para obtener enteros, podrías usar round, ceil o floor.

Podrías usar Math.round(Math.random() * (max - min)) + min, esto sin embargo da una distribución no uniforme. Ambos, min y max solo tiene aproximadamente la mitad de posibilidades de rodar:

min...min+0.5...min+1...min+1.5   ...    max-0.5....max
└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘   ← Math.round()
   min          min+1                          max

Con max excluido del intervalo, tiene incluso menos posibilidades de rodar que min.

Con Math.floor(Math.random() * (max - min +1)) + min tienes una distribución perfectamente pareja.

min.... min+1... min+2 ... max-1... max.... max+1 (is excluded from interval)
|        |        |         |        |        |
└───┬───┘└───┬───┘└─── ... ┘└───┬───┘└───┬───┘   ← Math.floor()
   min     min+1               max-1    max

No puedes usar ceil() y -1 en esa ecuación porque max ahora tenía un poco menos de posibilidad de rodar, pero puede tirar el (no deseado) min-1 resultado también


3050
2017-10-06 20:08



var randomnumber = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;

463
2017-10-06 20:09



Math.random ()

Desde el Mozilla Documentación de la red de desarrolladores:

// Returns a random integer between min (include) and max (include)

Math.floor(Math.random() * (max - min + 1)) + min;

Ejemplos útiles:

// 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;

72
2018-03-25 01:58



function getRandomizer(bottom, top) {
    return function() {
        return Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom;
    }
}

uso:

var rollDie = getRandomizer( 1, 6 );

var results = ""
for ( var i = 0; i<1000; i++ ) {
    results += rollDie() + " ";    //make a string filled with 1000 random numbers in the range 1-6.
}

Descompostura:

Estamos devolviendo una función (tomando prestada de la programación funcional) que cuando se llama, devolverá un entero aleatorio entre los valores bottom y top, inclusive Decimos 'inclusivo' porque queremos incluir tanto la parte inferior como la superior en el rango de números que se pueden devolver. De esta manera, getRandomizer( 1, 6 ) devolverá 1, 2, 3, 4, 5 o 6.

(abajo es un número más bajo, arriba es un número mayor)

Math.random() * ( 1 + top - bottom )

Math.random() devuelve un doble al azar entre 0 y 1, y si lo multiplicamos por uno más la diferencia entre top y bottom, obtendremos un doble en algún lugar entre 0 y 1+b-a.

Math.floor( Math.random() * ( 1 + top - bottom ) )

Math.floor redondea el número al número entero más cercano. Entonces ahora tenemos todos los enteros entre 0 y top-bottom. El 1 parece confuso, pero necesita estar allí porque siempre estamos redondeando, por lo que el número superior nunca se alcanzará sin él. El decimal aleatorio que generamos debe estar en el rango 0 a (1+top-bottom) para que podamos redondear y obtener un int en el rango 0 a top-bottom

Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom

El código en el ejemplo anterior nos dio un número entero en el rango 0 y top-bottom, entonces todo lo que tenemos que hacer ahora es agregar bottom a ese resultado para obtener un número entero en el rango bottom y top inclusivo. :RE


NOTA: Si pasa un valor no entero o el número mayor primero obtendrá un comportamiento indeseable, pero a menos que alguien lo solicite no voy a profundizar en el código de comprobación de argumentos ya que está bastante lejos de la intención de la pregunta original .


48
2017-10-06 20:08



Devuelve un número aleatorio entre 1 y 10:

Math.floor((Math.random()*10) + 1); 

Devuelve un número aleatorio entre 1 y 100:

Math.floor((Math.random()*100) + 1)

27
2018-03-28 11:31



function randomRange(min, max) {
  return ~~(Math.random() * (max - min + 1)) + min
}

Alternativa si estás usando Underscore.js puedes usar

_.random(min, max)

26
2018-02-09 19:51



Las otras respuestas no tienen en cuenta los parámetros perfectamente razonables de 0 y 1. En su lugar, debe usar el round  en lugar de ceil o floor:

function randomNumber(minimum, maximum){
    return Math.round( Math.random() * (maximum - minimum) + minimum);
}

console.log(randomNumber(0,1));  # 0 1 1 0 1 0
console.log(randomNumber(5,6));  # 5 6 6 5 5 6
console.log(randomNumber(3,-1)); # 1 3 1 -1 -1 -1

12
2017-07-21 16:42



Después de generar un número aleatorio usando un programa de computadora, todavía se considera como un número aleatorio si el número escogido es una parte o el completo de la inicial. Pero si fue cambiado, entonces los matemáticos no lo aceptan como un número aleatorio y pueden llamarlo un número sesgado. Pero si está desarrollando un programa para una tarea simple, este no será un caso a considerar. Pero si está desarrollando un programa para generar un número aleatorio de material valioso, como un programa de lotería o un juego de azar, la gerencia rechazará su programa si no tiene en cuenta el caso anterior.

Entonces, para ese tipo de personas, esta es mi sugerencia:

Genera un número aleatorio usando Math.random().(di esto n)

Now for [0,10) ==>  n*10 (i.e. one digit) and for[10,100) ==> n*100 (i.e. two digits) and so on. Here squire bracket indicates that boundary is inclusive and round bracket indicates boundary is exclusive.
Then remove the rest after the decimal point. (i.e. get floor) - using Math.floor(), this can be done.

Si sabes cómo leer la tabla de números aleatorios para elegir un número aleatorio, sabes que el proceso anterior (multiplicando por 1, 10, 100, etc.) no viola el que me mencionaron al principio. (Porque solo cambia el lugar del punto decimal.)

Estudie el siguiente ejemplo y desarrollelo según sus necesidades.

Si necesita una muestra [0,9], entonces su respuesta es el piso de n * 10 y si es necesario [0,99], entonces su respuesta es el piso de n * 100, y así sucesivamente.

Ahora deja entrar tu rol:

Has pedido números dentro del rango específico. (En este caso, usted está predispuesto dentro de ese rango. - Al tomar un número de [1,6] tirando un dado, entonces está predispuesto a [1,6] pero aún así es un azar si y solo si el dado es imparcial .)

Así que considere su rango ==> [78, 247] número de elementos del rango = 247 - 78 + 1 = 170; (dado que ambos límites son inclusivos)

/*Mthod 1:*/
    var i = 78, j = 247, k = 170, a = [], b = [], c, d, e, f, l = 0;
    for(; i <= j; i++){ a.push(i); }
    while(l < 170){
        c = Math.random()*100; c = Math.floor(c);
        d = Math.random()*100; d = Math.floor(d);
        b.push(a[c]); e = c + d;
        if((b.length != k) && (e < k)){  b.push(a[e]); }
        l = b.length;
    }
    console.log('Method 1:');
    console.log(b);
/*Method 2:*/

    var a, b, c, d = [], l = 0;
    while(l < 170){
        a = Math.random()*100; a = Math.floor(a);
        b = Math.random()*100; b = Math.floor(b);
        c = a + b;
        if(c <= 247 || c >= 78){ d.push(c); }else{ d.push(a); }
        l = d.length;
    }
    console.log('Method 2:');
    console.log(d);

Nota: En el método uno, primero creé una matriz que contiene los números que necesita y luego los coloco al azar en otra matriz. En el método dos, genere números aleatoriamente y verifique que estén en el rango que necesita. Luego ponlo en una matriz. Aquí generé dos números aleatorios y utilicé el total de ellos para maximizar la velocidad del programa al minimizar la tasa de fallas al obtener un número útil. Sin embargo, agregar números generados también dará cierta parcialidad. Así que recomendaría mi primer método para generar números aleatorios dentro de un rango específico.

En ambos métodos, la consola mostrará el resultado. (Presione f12 en Chrome para abrir la consola)


9
2018-02-10 13:22