¿Hay alguna 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?
javascript
random
Mirgorod
fuente
fuente
Math.floor((Math.random()*10)+1);
no puede funcionar para usted como se especifica aquí en w3schools.com/jsref/jsref_random.asp ..?Respuestas:
Importante
El siguiente código funciona solo si el valor mínimo es
1
. No funciona para valores mínimos que no sean1
.Si desea obtener un número entero aleatorio entre 1 ( y solo 1 ) y 6, calcularía:
Dónde:
fuente
Math.floor(Math.random() * 6) + 2
significa que siMath.random()
los resultados en nuestra 0.99 valor aleatorio serían7
Lo que hace "extra" es que permite intervalos aleatorios que no comienzan con 1. Por lo tanto, puede obtener un número aleatorio del 10 al 15, por ejemplo. Flexibilidad.
fuente
to
argumento, elfrom
argumento se dobla como máximoReturns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range.
( developer.mozilla.org/en-US/docs/JavaScript/Reference/… )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
[1,2]
, hay 25% de posibilidadesMath.random()
que le dará un número de uno de éstos[0,0.49]
,[0.5,0.99]
,[1,1.49]
,[1.5,1.99]
. Redondear esos intervalos daría como resultado 0, 1, 1, 2, que no es una distribución uniforme.Math.round
overMath.floor
daría resultados diferentes.function getRandomInt(min, max) { return Math.round((min - 0.5) + Math.random() * (max - min + 1)); }
Otras soluciones:
(Math.random() * 6 | 0) + 1
~~(Math.random() * 6) + 1
Probar en línea
fuente
~~a
y Bitwise OR (a | 0) son formas más rápidas de escribir Math.floor (a)a | 0
es también la forma más rápida y optimizada de convertir una cadena en un entero. Solo funciona con cadenas que contienen enteros ("444"
y"-444"
), es decir, sin flotantes / fracciones. Produce un0
por todo lo que falla. Es una de las principales optimizaciones detrás de asm.js.~~(Math.random() * (50000000000000 - 0 + 1)) + 0
yMath.floor(Math.random() * (50000000000000 - 0 + 1)) + 0
TL; DR
Para obtener el número aleatorio
generateRandomInteger(-20, 20);
EXPLICACIÓN A CONTINUACIÓN
Necesitamos obtener un número entero aleatorio, digamos X entre min y max.
¿Derecha?
es decir, min <= X <= max
Si restamos min de la ecuación, esto es equivalente a
0 <= (X - min) <= (máx - min)
Ahora, multipliquemos esto con un número aleatorio r que es
0 <= (X - min) * r <= (máx - min) * r
Ahora, agreguemos de nuevo min a la ecuación
min <= min + (X - min) * r <= min + (max - min) * r
Ahora, elija una función que resulte en r de manera que satisfaga nuestro rango de ecuaciones como [min, max]. Esto solo es posible si 0 <= r <= 1
OKAY. Ahora, el rango de r, es decir, [0,1] es muy similar al resultado de la función Math.random (). ¿No es así?
Por ejemplo,
Caso r = 0
min
+ 0 * (max
-min
) = minCaso r = 1
min
+ 1 * (max
-min
) = máx.Caso aleatorio usando Math.random 0 <= r <1
min
+ r * (max
-min
) = X , donde X tiene un rango de min <= X < maxEl 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 subimos el resultado.
Para obtener el número aleatorio
generateRandomInteger(-20, 20)
;fuente
O, en subrayado
fuente
fuente
jsfiddle: https://jsfiddle.net/cyGwf/477/
Entero aleatorio : para obtener un entero aleatorio entre
min
ymax
, use el siguiente códigoNúmero aleatorio de coma flotante : para obtener un número aleatorio de coma flotante entre
min
ymax
, use el siguiente códigoReferencia: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
fuente
Las matemáticas no son mi punto fuerte, pero he estado trabajando en un proyecto donde necesitaba generar muchos números aleatorios entre positivos y negativos.
P.ej
Por supuesto, también puede agregar alguna validación para asegurarse de no hacer esto con otra cosa que no sean números. También asegúrese de que min siempre sea menor o igual que max.
fuente
min + Math.random() * max
le dará números entre min y min + max, que no es lo que desea. La primera rama de laif
es correcta, pero podría simplificarse para decirreturn min + Math.random() * (max - min)
cuál es la solución correcta independientemente de si min es positivo o negativo (ver las otras respuestas). Además, tenga en cuenta que aún necesita anotar el resultado si no desea fracciones.Escribí una función más flexible que puede darte un número aleatorio pero no solo un entero.
Versión fija
fuente
Ejemplo
Devuelve un número aleatorio entre 1 y 10:
El resultado podría ser:
3
Pruébalo tú mismo: aquí
-
o usando lodash / undescore:
_.random(min, max)
Documentos: - lodash - undescore
fuente
A pesar de muchas respuestas y casi el mismo resultado. Me gustaría agregar mi respuesta y explicar su funcionamiento. Porque es importante comprender 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:
fuente
Estaba buscando un generador de números aleatorios escrito en TypeScript y lo he escrito después de leer todas las respuestas, espero que funcione para los codificadores de TypeScript.
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
Agregando
float
con una versión de precisión fija basada en laint
versión en la respuesta de @ Francisc:entonces:
y para int respuesta
fuente
Número entero aleatorio cripto-fuerte en el rango [a, b] (suposición: a <b)
fuente
Esto debería funcionar:
fuente
Descubrí una nueva forma de hacer esto usando los parámetros predeterminados de ES6. Es muy ingenioso ya que permite un argumento o dos argumentos. Aquí está:
fuente
Esto lleva unos nueve años de retraso, pero randojs.com lo convierte en una frase simple:
Solo necesita agregar esto al encabezado de su documento html, y puede hacer casi lo que quiera con aleatoriedad fácilmente. Valores aleatorios de matrices, elementos jquery aleatorios, propiedades aleatorias de objetos e incluso evitar repeticiones si es necesario.
fuente
Esto funciona para mí y produce valores como la función de biblioteca estándar random.randint de Python :
fuente
Intenta usar:
fuente
para devolver 1-6 como un dado básicamente,
fuente