Considerar:
var myArray = ['January', 'February', 'March'];
¿Cómo puedo seleccionar un valor aleatorio de esta matriz usando JavaScript?
javascript
Sarah
fuente
fuente
Math.floor(Math.random(...))
llamada, que se redondea hacia abajo.var rand = myArray[Math.random() * myArray.length>>0]
haber sido un poco más rápidovar rand = myArray[Math.random() * myArray.length | 0]
Si ya tiene subrayado o lodash incluido en su proyecto, puede usarlo
_.sample
.Si necesita obtener más de un elemento al azar, puede pasarlo como segundo argumento en guión bajo:
o use el
_.sampleSize
método en lodash:fuente
Método de prototipo
Si planea obtener un valor aleatorio mucho, es posible que desee definir una función para él.
Primero, pon esto en tu código en alguna parte:
Ahora:
Código publicado en el dominio público bajo los términos de la licencia CC0 1.0 .
fuente
.sample()
a cualquier matriz para obtener un elemento aleatorio~~
es mucho más rápido queMath.Floor()
, por lo que cuando se trata de la optimización del rendimiento al producir resultados utilizando elementos de la interfaz de usuario,~~
gana el juego. MÁS INFORMACIÓNPero si sabe que la matriz tendrá millones de elementos, es posible que desee reconsiderar entre el Operador a nivel de bits y
Math.Floor()
, dado que el operador a nivel de bits se comporta de manera extraña con números grandes. Vea el siguiente ejemplo explicado con la salida. MÁS INFORMACIÓNfuente
Math.floor
Digamos que desea elegir un elemento aleatorio que sea diferente de la última vez (no realmente aleatorio, pero sigue siendo un requisito común) ...
Sobre la base de la respuesta de @Markus, podemos agregar otra función prototipo:
E implementar así:
fuente
Si tiene valores fijos (como una lista de nombres de mes) y desea una solución de una línea
La segunda parte de la matriz es una operación de acceso como se describe en ¿Por qué [5,6,8,7] [1,2] = 8 en JavaScript?
fuente
La versión más corta:
fuente
| 0
hacer?| 0
sí es una operación bit a bit que no hace nada, pero en javascript los flotadores se convierten en ints antes de cualquier operación bit a bit . Entonces, es algo así como+ ''
que realmente no hace nada, pero se puede usar para convertir cosas en cadenas.Math.floor
pero es lo correcto hacer aquí. Es un operador, por lo que es más rápido queMath.floor
si solo porque en cualquier momento mientras se ejecuta un código puede hacerMath.floor = someOtherFunction
y no pueden hacer lo mismo para '|'. Por otro lado como paraMath.floor
y|
ser diferente intentoMath.floor(-1.5)
vs-1.5 | 0
. Por cierto, no necesitas los paréntesis.|
Tiene una muy baja precedencia.Si desea escribirlo en una línea, como la solución de Pascual, otra solución sería escribirlo utilizando la función de búsqueda de ES6 (basado en el hecho de que la probabilidad de seleccionar uno de los
n
elementos al azar es1/n
):Use ese enfoque para fines de prueba y si hay una buena razón para no guardar la matriz solo en una variable separada. De lo contrario, las otras respuestas (
floor(random()*length
y el uso de una función separada) son su camino a seguir.fuente
Faker.js tiene muchas funciones de utilidad para generar datos de prueba aleatorios. Es una buena opción en el contexto de un conjunto de pruebas:
Como los comentaristas han mencionado, generalmente no debe usar esta biblioteca en el código de producción.
fuente
Faker
que selecciona un elemento de matriz aleatorio.La edición del prototipo de matriz puede ser perjudicial. Aquí es una función simple para hacer el trabajo.
Uso:
fuente
Función recursiva independiente que puede devolver cualquier número de elementos (idéntico a lodash.sampleSize ):
fuente
Para obtener una matriz de forma de elemento aleatorio cripto-fuerte, use
fuente
Esto es similar pero más general que la solución de @Jacob Relkin:
Esto es ES2015:
El código funciona seleccionando un número aleatorio entre 0 y la longitud de la matriz, y luego devuelve el elemento en ese índice.
fuente
var item = myArray[Math.floor(Math.random()*myArray.length)];
o versión equivalente más corta:
var item = myArray[(Math.random()*myArray.length)|0];
Código de muestra:
fuente
Función simple:
O
O
fuente
En mi opinión, mejor que jugar con los prototipos o declararlo justo a tiempo, prefiero exponerlo a la ventana:
Ahora, en cualquier lugar de su aplicación, lo llama así:
De esta manera, aún puede usar el
for(x in array)
bucle correctamentefuente
for...in
en matrices, o incluso en general. Corres el riesgo de caminar por la cadena del prototipo. También está destinado a todas las propiedades de un objeto, no a todos los índices de una matriz. Si desea usar un iterador en una matriz, usefor (var i = 0; i < foo.length; i++){}
. Aún mejor, use algo como en suArray.prototype.forEach
lugar.He encontrado una forma de evitar las complicaciones de la respuesta principal, simplemente concatenando la variable rand con otra variable que permite que ese número se muestre dentro de la llamada de myArray [] ;. Al eliminar la nueva matriz creada y jugar con sus complicaciones, he encontrado una solución que funciona:
fuente
concat
siempre está cambiando aquí ...random
sí no lo está cambiando, y nada más está siendo llamado más de una vez ....Establece una variable constante en la matriz, luego tiene otra constante que elige aleatoriamente entre los tres objetos en la matriz y luego la función simplemente devuelve los resultados.
fuente
Una forma genérica de obtener elementos aleatorios:
fuente
randojs hace esto un poco más simple y legible:
fuente
Aquí hay un ejemplo de cómo hacerlo:
fuente
Otro método fácil:
fuente
Crea un valor aleatorio y pasa a la matriz
Intenta seguir el siguiente código ...
fuente