1484 votos

La generación de números aleatorios en Javascript en un rango específico?

¿Cómo puedo generar un número entero aleatorio entre dos determinadas variables en Javascript, por ejemplo. x = 4 y y = 8 sería la salida de cualquiera de 4, 5, 6, 7, 8?

3050voto

Ionuț G. Stan Puntos 62482

Hay algunos ejemplos en el Mozilla Developer Center de la 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;
}

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

Math.random() devuelve un Number entre 0 (inclusive) y 1 (exclusivo). Así que tenemos un intervalo de como este:

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

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

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

Podemos utilizar la Math.random para obtener el corresponsal en la [min, max) intervalo. Pero, en primer lugar debemos factor un poco el problema restando min desde el segundo intervalo:

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

Esto nos da:

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

Ahora podemos aplicar Math.random y, a continuación, calcular el corresponsal. Vamos a elegir un número al azar:

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

Así, con el fin de encontrar x, haríamos:

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

No se olvide de agregar min de la espalda, de manera que obtenemos un número en el [min, max) intervalo:

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

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

Ahora para llegar enteros, puede utilizar round, ceil o floor.

Usted podría utilizar Math.round(Math.random() * (max - min)) + min, sin embargo, esto le da un no-distribución uniforme. Ambos, min y max aproximadamente la mitad de la posibilidad de hacer rodar:

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

Con max excluidos del intervalo, se tiene aún menos posibilidades para rollo que min.

Con Math.floor(Math.random() * (max - min +1)) + min tiene una perfecta distribución.

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

Usted no puede utilizar ceil() y -1 en esa ecuación, porque max ahora tiene un poco menos de probabilidad de que rollo, pero usted puede rodar la (no deseados) min-1 resultado demasiado.

463voto

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

48voto

Gordon Gustafson Puntos 14778
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.
}

desglose:

Estamos volviendo a una función (préstamo de programación funcional) que cuando se le llama, se devolverá un entero aleatorio entre los valores de bottom y top, inclusive. Decimos 'inclusiva', porque queremos incluir tanto la parte inferior y superior del rango de números que pueden ser devueltos. De esta manera, getRandomizer( 1, 6 ) devolverá 1, 2, 3, 4, 5, o 6.

(abajo está el número inferior, la parte superior es mayor el número)

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

Math.random() devuelve una aleatorio doble entre 0 y 1, y si multiplicamos por uno más la diferencia entre los top y bottom, vamos a conseguir 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 entero más cercano. Así que ahora tenemos todos los enteros entre 0 y top-bottom. La 1 se ve confuso, pero tiene que estar ahí, porque siempre estamos redondeando hacia abajo, por lo que el número de arriba en realidad nunca va a ser alcanzado sin ella. El decimal aleatorio generamos debe estar en el rango 0 a (1+top-bottom) por lo que podemos redondear a la baja y obtener un entero en el rango 0 a top-bottom

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

El código del ejemplo anterior nos dio un entero en el intervalo 0 y top-bottom, por lo que todo lo que necesitamos hacer ahora es agregar bottom para que el resultado para obtener un número entero en el rango bottom y top incluido. :D


NOTA: Si se pasa en un no-valor entero o el mayor número de primeros obtendrá un comportamiento indeseable, pero a menos de que alguien las solicitudes que no voy a ahondar en el argumento de código de comprobación como su más lejos de la intención de la pregunta original.

26voto

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

Alternativa si usted está usando Underscore.js usted puede usar

_.random(min, max)

8voto

user1764199 Puntos 49

Para un entero aleatorio con un alcance, trate de:

            function random (minimum, maximum){
            var bool = true;
            while(bool) {
            var number = (Math.floor(Math.random()*maximum+1)+minimum);
                if (number > 20) {bool = true;}
                else {bool = false;}}
            return number;}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X