2011-08-23 14 views
36

Duplicar posible:
JavaScript: Getting random value from an arrayComo llegar elementos aleatorios de una matriz

var numbers = new Array('1','2','4','5','6','7','8','9','10'); 

Tengo una matriz de JavaScript y ahora quiero elegir al azar cuatro números diferentes de ella y luego expresarlo en la página (a través del document.write). Obviamente, cada vez que el usuario recargue la página, mostrará cuatro números aleatorios diferentes.

+4

OT: Es una buena práctica usar literales de matriz: 'var numbers = ['1', ...];'. –

+9

En realidad, esta no es la misma pregunta que el duplicado supuesto: obtener más de un valor diferente, correctamente aleatorio de una matriz es mucho más complicado que obtener un valor aleatorio. –

+0

@TimDown: De acuerdo. Si esta sería la misma pregunta que el supuesto duplicado, la respuesta (s) sería la misma (las mismas preguntas tienen las mismas respuestas, ¿no?) Que claramente no lo son. – Juan

Respuesta

49

Puede barajar la matriz y elegir las cuatro primeras.

numbers.sort(function() { return 0.5 - Math.random() }); 

Ahora numbers[0], numbers[1] ... y así sucesivamente tienen elementos aleatorios y únicos.

Tenga en cuenta que este método puede no ser una forma óptima de reorganizar una matriz: consulte Is it correct to use JavaScript Array.sort() method for shuffling? para la discusión.

+2

Bueno, buen punto teniendo los elementos únicos en cuenta – Jochem

+4

No importa en esta circunstancia, pero me parece interesante de todos modos, este método resulta no ser tan aleatorio después de todo: http : //www.sitepoint.com/microsoft-fix-the-non-random-browser-chocolate-screen/ – Matt

+0

@Matt Buen punto, voy a editar la respuesta. – JJJ

3
//return a random integer between 0 and 10 

document.write(Math.floor(Math.random()*11)); 
+1

Supuse que "cuatro números diferentes" significa que los números deben ser únicos . – JJJ

+0

O 'document.write (números [(Math.floor (Math.random() * 11)]]);' que se vuelve cada vez más importante si la matriz de números no contiene algo tan trivial como 1-10. – Jochem

+0

No lo hice 'Como dice cada vez que se carga la página, debe ser aleatoria. – NimChimpsky

2
var numbers = new Array('1','2','4','5','6','7','8','9','10'); 
document.write(numbers[Math.floor(Math.random()*numbers.length)]); 
18

Si desea que esto sea tan aleatorio como las implementaciones nativas de JavaScript de Math.random() permitirán, podría utilizar algo como lo siguiente, que también tiene las ventajas de salir de la matriz original intacto y sólo se asignaron al azar a la mayor cantidad de la matriz según sea necesario:

function getRandomArrayElements(arr, count) { 
    var shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index; 
    while (i-- > min) { 
     index = Math.floor((i + 1) * Math.random()); 
     temp = shuffled[index]; 
     shuffled[index] = shuffled[i]; 
     shuffled[i] = temp; 
    } 
    return shuffled.slice(min); 
} 


var numbers = ['1','2','4','5','6','7','8','9','10']; 
alert(getRandomArrayElements(numbers, 4)); 
Cuestiones relacionadas