¿Cómo puedo generar números enteros aleatorios entre dos variables especificadas en JavaScript, por ejemplo, x = 4
y y = 8
generaría alguna 4, 5, 6, 7, 8
?
javascript
random
integer
zacharyliu
fuente
fuente
Respuestas:
Hay algunos ejemplos en la página Mozilla Developer Network :
Aquí está la lógica detrás de esto. Es una regla simple de tres:
Math.random()
devuelve un valorNumber
entre 0 (incluido) y 1 (exclusivo). Entonces tenemos un intervalo como este:Ahora, nos gustaría un número entre
min
(inclusive) ymax
(exclusivo):Podemos usar el
Math.random
para obtener el correspondiente en el intervalo [min, max). Pero, primero debemos factorizar un poco el problema restandomin
del segundo intervalo:Esto da:
Ahora podemos aplicar
Math.random
y luego calcular el corresponsal. Elija un número aleatorio:Entonces, para encontrar
x
, haríamos:No olvide
min
volver a agregar , para que obtengamos un número en el intervalo [min, max):Esa fue la primera función de MDN. El segundo, devuelve un número entero entre
min
ymax
, ambos inclusive.Ahora para obtener enteros, puedes usar
round
,ceil
ofloor
.Podría usar
Math.round(Math.random() * (max - min)) + min
, sin embargo, esto proporciona una distribución no uniforme. Ambos,min
ymax
solo tienen aproximadamente la mitad de posibilidades de rodar:Con
max
excluidos del intervalo, tiene incluso menos posibilidades de rodar quemin
.Con
Math.floor(Math.random() * (max - min +1)) + min
usted tiene una distribución perfectamente uniforme.No puede usar
ceil()
y-1
en esa ecuación porquemax
ahora tenía una probabilidad ligeramente menor de rodar, pero también puede rodar el resultado (no deseado)min-1
.fuente
floor
, que se redondea.round
, pero luego ambos,min
ymax
solo tenía la mitad de posibilidades de rodar como lo hacen los otros números. También puedes restar uno y tomarceil
. Sin embargo, esto deja almax
número con una probabilidad mínima de rodar debido al[0,1)
intervalo.fuente
(Math.random() * (maximum - minimum + 1) ) << 0
es más rápido.x << 0
,x | 0
,~~x
) en lugar deMath.floor()
los convertidosx
en dos complemento con un rango mucho menor queNumber.MAX_SAFE_INTEGER
(vs 2³²⁻¹ 2⁵³), por lo tanto usted tiene que usarlo con precaución!657348096152|0
, obtienes 218099864 (1100111111111111000010011000 en binario).Math.random ()
Devuelve un número aleatorio entero entre min ( incluido ) y max ( incluido ):
O cualquier número aleatorio entre min ( incluido ) y max ( no incluido ):
Ejemplos útiles (enteros):
** Y siempre es bueno recordarlo (Mozilla):
fuente
uso:
Descompostura:
Estamos devolviendo una función (tomando prestada de la programación funcional) que cuando se llama, devolverá un número entero aleatorio entre los valores
bottom
etop
inclusive. Decimos "inclusivo" porque queremos incluir tanto los de abajo como los de arriba en el rango de números que se pueden devolver. De esta manera,getRandomizer( 1, 6 )
devolverá 1, 2, 3, 4, 5 o 6.(la parte inferior es el número inferior, la superior es el número mayor)
Math.random()
devuelve un doble aleatorio entre 0 y 1, y si lo multiplicamos por uno más la diferencia entretop
ybottom
, obtendremos un doble en algún lugar entre0
y1+b-a
.Math.floor
redondea el número al entero más cercano. Entonces ahora tenemos todos los enteros entre0
ytop-bottom
. El 1 parece confuso, pero debe estar allí porque siempre estamos redondeando hacia abajo, por lo que el número superior nunca se alcanzará sin él. El decimal aleatorio que generamos debe estar en el rango0
para(1+top-bottom)
poder redondear hacia abajo y obtener un int en el rango0
paratop-bottom
El código en el ejemplo anterior nos dio un número entero en el rango
0
ytop-bottom
, por lo tanto, todo lo que tenemos que hacer ahora es agregarbottom
a ese resultado para obtener un número entero en el rangobottom
etop
inclusive. :RENOTA: 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 verificación de argumentos, ya que está bastante lejos de la intención de la pregunta original .
fuente
Alternativa si está utilizando Underscore.js puede usar
fuente
_.uniqueId()
función que puede llamar para modelos del lado del cliente.x << 0
,x | 0
,~~x
) en lugar deMath.floor()
los convertidosx
en una de dos complemento con un rango mucho menor queNumber.MAX_SAFE_INTEGER
(vs 2³²⁻¹ 2⁵³), por lo tanto usted tiene que usarlo con precaución!Devuelve un número aleatorio entre 1 y 10:
Devuelve un número aleatorio entre 1 y 100:
fuente
Si necesita una variable entre 0 y max, puede usar:
fuente
Las otras respuestas no tienen en cuenta los parámetros perfectamente razonables de
0
y1
. En su lugar, debe usar el enround
lugar deceil
ofloor
:fuente
console.log(randomNumber(5,6)); # 9 6 6 5 7 7
¿Los números 9 y 7 se encuentran entre 5 y 6? ...... deberías corregirlo o explicarlo ..Aquí está la implementación MS DotNet de la clase Random en javascript-
Utilizar:
fuente
Use esta función para obtener números aleatorios entre el rango dado
fuente
Después de generar un número aleatorio utilizando un programa de computadora, todavía se considera como un número aleatorio si el número seleccionado es parte o el número completo del inicial. Pero si se cambió, 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 para un material valioso como un programa de lotería o un juego de azar, la administración rechazará su programa si no tiene en cuenta el caso anterior.
Entonces, para ese tipo de personas, aquí está mi sugerencia:
Genere un número aleatorio usando
Math.random()
. (Diga eston
)Si sabe cómo leer la tabla de números aleatorios para elegir un número aleatorio, sabe que el proceso anterior (multiplicar por 1, 10, 100, etc.) no viola el que mencioné al principio. (Porque solo cambia el lugar del punto decimal.)
Estudie el siguiente ejemplo y desarrolle según sus necesidades.
Si necesita una muestra [0,9], entonces el piso de n * 10 es su respuesta y si necesita [0,99] entonces el piso de n * 100 es su respuesta y así sucesivamente.
Ahora deja entrar en tu rol:
Has pedido números entre un rango específico. (En este caso, estás sesgado dentro de ese rango. - Al tomar un número de [1,6] tirando un dado, entonces estás sesgado en [1,6] pero aún así es aleatorio 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; (ya que ambos límites son inclusivos.
Nota: En el método uno, primero creé una matriz que contiene números que necesita y luego los puse al azar en otra matriz. En el método dos, genere números al azar y verifique que estén en el rango que necesita. Luego póngalo en una matriz. Aquí generé dos números aleatorios y usé el total de ellos para maximizar la velocidad del programa minimizando la tasa de falla que obtenía un número útil. Sin embargo, agregar números generados también dará cierta parcialidad. Por lo tanto, recomendaría mi primer método para generar números aleatorios dentro de un rango específico.
En ambos métodos, su consola mostrará el resultado. (Presione f12 en Chrome para abrir la consola)
fuente
Math.floor(Math.random() * (6 - 1 + 1) + 1)
] los números 1 y 6 necesariamente se rodarán menos veces que 2, 3, 4 y 5. Sin embargo, la diferencia es básicamente insignificante.Para un entero aleatorio con un rango, intente:
fuente
Para probar esta función y las variaciones de esta función, guarde el siguiente HTML / JavaScript en un archivo y ábralo con un navegador. El código producirá un gráfico que muestra la distribución de un millón de llamadas a funciones. El código también registrará los casos límite, por lo que si la función produce un valor mayor que el máximo, o menor que el mínimo, usted.will.know.about.it.
fuente
Para obtener un número aleatorio que diga entre 1 y 6, primero haga:
Esto multiplica un número aleatorio por 6 y luego le agrega 0.5. Luego redondea el número a un entero positivo haciendo:
Esto redondea el número al número entero más cercano.
O para hacerlo más comprensible, haga esto:
En general, el código para hacer esto usando variables es:
La razón para quitar 0.5 del valor mínimo es porque usar solo el valor mínimo le permitiría obtener un número entero que fuera uno más que su valor máximo. Al quitar 0.5 del valor mínimo, esencialmente evita que el valor máximo se redondee hacia arriba.
Espero que ayude.
fuente
Usando el siguiente código puede generar una matriz de números aleatorios, sin repetir, en un rango dado.
fuente
Sé que esta pregunta ya está respondida, pero mi respuesta podría ayudar a alguien.
Encontré este método simple en W3Schools:
Espero que esto ayude a alguien.
fuente
Número entero aleatorio entre el más bajo y el más alto:
No es la solución más elegante ... pero algo rápido.
fuente
Esto es lo que uso para generar números aleatorios.
Realizamos la ejecución
high++
porqueMath.random()
genera un número aleatorio entre 0, (inclusive) y 1 (exclusivo). El excluido significa que debemos aumentar el valor alto en uno antes de ejecutar cualquier cálculo matemático. Luego restamos bajo de alto, dándonos el número más alto para generar: bajo, luego + bajo, devolviendo el alto a la normalidad, y haciendo que el número más bajo al menos sea bajo. luego devolvemos el número resultanterandom(7,3)
podría volver3,4,5,6, or 7
fuente
high
solo se usa una vez, también puede usar enhigh-low+1
lugar de tener la declaración de incremento separada. Además, la mayoría de los usuarios esperarían que ellow
parámetro sea lo primero.Uint8Array crea una matriz llena de un número de hasta 3 dígitos que sería un máximo de 999. Este código es muy corto.
fuente
Aquí hay un ejemplo de una función de JavaScript que puede generar un número aleatorio de cualquier longitud especificada sin usar Math.random ():
fuente
Esta es mi opinión sobre un número aleatorio en un rango, ya que quería obtener un número aleatorio dentro de un rango de base a exponente. Por ejemplo, base = 10, exponente = 2, da un número aleatorio de 0 a 100, idealmente, y así sucesivamente.
si ayuda a usarlo, aquí está:
fuente
Math.random()
es rápido y adecuado para muchos propósitos, pero no es apropiado si necesita valores criptográficamente seguros (no es seguro) o si necesita números enteros de una distribución imparcial completamente uniforme (el enfoque de multiplicación utilizado en otras respuestas produce ciertos valores un poco más a menudo que otros).En tales casos, podemos usar
crypto.getRandomValues()
para generar enteros seguros y rechazar cualquier valor generado que no podamos asignar de manera uniforme en el rango objetivo. Esto será más lento, pero no debería ser significativo a menos que esté generando cantidades extremadamente grandes de valores.Para aclarar el problema de la distribución sesgada, considere el caso en el que queremos generar un valor entre 1 y 5, pero tenemos un generador de números aleatorios que produce valores entre 1 y 16 (un valor de 4 bits). Queremos tener el mismo número de valores generados que se asignen a cada valor de salida, pero 16 no se divide equitativamente por 5: deja un resto de 1. Por lo tanto, debemos rechazar 1 de los posibles valores generados, y solo continuar cuando obtengamos uno de los 15 valores menores que se pueden mapear uniformemente en nuestro rango objetivo. Nuestro comportamiento podría parecerse a este pseudocódigo:
El siguiente código utiliza una lógica similar, pero en su lugar genera un número entero de 32 bits, porque ese es el tamaño entero común más grande que puede ser representado por el
number
tipo estándar de JavaScript . (Esto podría modificarse para usarBigInt
s si necesita un rango mayor). Independientemente del rango elegido, la fracción de valores generados que se rechazan siempre será menor que 0.5, por lo que el número esperado de rechazos siempre será menor que 1.0 y usualmente cerca de 0.0; no necesita preocuparse por que se repita para siempre.fuente
Crypto-Strong
Para obtener un número entero aleatorio cripto-fuerte en ragne [x, y] intente
fuente
Puedes este fragmento de código,
fuente
do - while
lugar dewhile
Ionuț G. Stan escribió una gran respuesta, pero fue un poco demasiado complejo para mí. Entonces, encontré una explicación aún más simple de los mismos conceptos en https://teamtreehouse.com/community/mathfloor-mathrandom-max-min-1-min-explanation por Jason Anello.
NOTA: Lo único importante que debe saber antes de leer la explicación de Jason es una definición de "truncar". Él usa ese término cuando describe
Math.floor()
. El diccionario de Oxford define "truncar" como:fuente
Esto puede manejar la generación de números aleatorios ÚNICOS de hasta 20 dígitos
JS
JsFiddle
fuente
/ * ¿Escribir una función llamada
randUpTo
que acepta un número y devuelve un número entero aleatorio entre 0 y ese número? * // * Escriba una función llamada
randBetween
que acepte dos números que representen un rango y devuelva un número entero aleatorio entre esos dos números. * // * Escriba una función llamada
randFromTill
que acepte dos números que representen un rango y devuelva un número aleatorio entre min (inclusive) y max (exclusivo). * // * Escribe una función llamada
randFromTo
que acepta dos números que representan un rango y devuelve un entero aleatorio entre min (inclusive) y max (inclusive) * /fuente
Hice esta función que tiene en cuenta opciones como min, max, exclude (una lista de entradas para excluir) y seed (en caso de que desee un generador aleatorio sembrado).
Se puede usar como:
O más simplemente:
Entonces puedes hacer:
Gist: https://gist.github.com/madprops/757deb000bdec25776d5036dae58ee6e
fuente
Math.floor redondea un número hacia abajo al entero más cercano
Entonces, para generar un entero aleatorio entre 4 y 8 inclusive, llame a la función anterior con los siguientes argumentos:
fuente
Mi método para generar un número aleatorio entre 0 yn, donde n <= 10 (n excluido):
fuente