2011-04-21 11 views
5

¿Cuál es la mejor manera de generar 5 enteros aleatorios que no dupliquen entre 0 y 20?javascript 5 enteros aleatorios que no duplican 0 - 20

Estoy pensando, use Math.random con floor, repítalo 5 veces, verifique si hay duplicados, si están duplicados, al azar nuevamente.

¿Cuál es su forma?

+0

bien, ese es el camino :) –

+1

Otra forma es poner todos los valores posibles en una matriz, mezclarlos y tomar los primeros 5. –

+0

5 veces el mismo resultado también es aleatorio. ¿O no confías en el universo? ;) –

Respuesta

0

Editar: Una solución mejor que este o los demás incluidas en este documento se puede encontrar in this answer a esta pregunta cuando se le preguntó de nuevo en 2008. En resumen: Generar una matriz (como Darin sugiere en su respuesta a continuación) y barájalo usando el Knuth-Yates-Fisher shuffle. No utilice una combinación ingenua, use una que se sabe que tiene buenos resultados.


Eso es más o menos cómo lo haría, sí. Probablemente usaría un objeto para hacer un seguimiento de los enteros que ya tenía, ya que es conveniente. Por ejemplo:

var ints = {}; 

Luego, una vez que haya creado un nuevo número aleatorio, lo comprueba y, posiblemente, mantenerlo:

if (!ints[number]) { 
    // It's a keeper 
    ints[number] = true; 
    results.push(number); 
} 
+0

No estoy seguro de por qué la persona anterior downvoted pero estoy downvoting porque se trata de un algoritmo teóricamente sin fin. En otras palabras, es posible que un generador aleatorio pueda generar los mismos valores una y otra vez, haciendo que su ciclo nunca termine. Con solo cinco valores, esto es prácticamente imposible, pero ¿qué ocurre cuando se necesitan 5000 elementos? Nuevamente, en la práctica, no será interminable, pero el tiempo que toma es no determinista. Hay otros algoritmos (como el de Darin) que producirán resultados determinísticos. Yo iría con uno de ellos en su lugar. –

+0

@BrianGenisio: Quizás. Pero usar la mezcla que Darin señaló no dará buenos resultados aleatorios. Vea [esta respuesta] (http://stackoverflow.com/questions/196017/unique-random-numbers-in-o1) para saber por qué necesita algo más sofisticado. –

7

Puede generar una matriz de números del 0 al 20, shuffle it y tomar los primeros 5 elementos de la matriz resultante.

+1

Para un rango tan limitado, tiene mucho sentido . Para una gama más grande, obviamente, no tanto, pero teniendo en cuenta 0..20 ... –

3

respuesta tardía sé, pero:

var a=[]; 
while(a.length <3) { 
    var n = Math.round(Math.random() * 20); 
    if (a.indexOf(n)==-1) a.push(n); 
} 

=> [14, 17, 19]

Cuestiones relacionadas