Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Linton en 30 Julio 2013, 22:36 pm



Título: [JS] Random sin repetir
Publicado por: Linton en 30 Julio 2013, 22:36 pm
Estaba buscando si había una función interna de javascript para seleccionar elementos de un array sin repetirlos, y me parece que no. Así que haré un programa con ese fin.

¿Alguna sugerencia? No pido código sino sólo una orientación general :)

Muchas gracias, un saludo.


Título: Re: [JS] Random sin repetir
Publicado por: 1mpuls0 en 31 Julio 2013, 05:27 am
A ver si entendí.

Por ejemplo tienes
[1][2][3][2][4][5]

y quieres que te seleccione?.
[1][2][3][4][5]



Saludos.


Título: Re: [JS] Random sin repetir
Publicado por: Linton en 31 Julio 2013, 07:27 am
Eso es  :)

No necesariamente con el mismo número de elementos, es decir, que con ['1', '2', '3', '4', '5', '6', '7', '8','9','10','11','12'] seleccione por ejemplo ['3','9', '2', '5', '7'].

La cantidad que sea, siempre sin repetir ninguno.

Un saludo.


Título: Re: [JS] Random sin repetir
Publicado por: 1mpuls0 en 31 Julio 2013, 08:59 am
Quieres seleccionar x numeros aleatorios pero sin repetir?.

si es así, puedes tener dos array el primero es donde tienes todos tus numeros el segundo es donde vas a ir guardando.

recorre el primero arreglo con un ciclo.
si el elemento del indice se encuentra en el array2 entonces no lo guarda
en caso contrario lo guarda
hasta que termine de recorrer array1

Saludos.


Título: Re: [JS] Random sin repetir
Publicado por: Linton en 31 Julio 2013, 10:08 am
Me pongo a ello, a ver si saco un script limpio y decente :) ¡Muchas gracias por tu ayuda!


Título: Re: [JS] Random sin repetir
Publicado por: Linton en 31 Julio 2013, 19:26 pm
Pues no lo consigo...  :P Aquí va mi intento:
Código
  1. function selecLista(){
  2.  
  3. var zoo = ['Gato', 'Perro', 'Caballo', 'Ganso', 'Pez', 'Foca', 'Papagayo', 'Coyote', 'Milano', 'Nutria', 'Cotorra', 'Tigre'];
  4. var lote = [];
  5.  for(i=0; i<4; i++){
  6.  lote[i] = zoo[parseInt(Math.random()* 12)];
  7.  if(lote.indexOf(zoo[parseInt(Math.random()*14)])!=-1)
  8.    break;
  9. }
  10.  document.write(lote);
  11. }
  12. selecLista();

A veces en vez de cuatro se obtienen tres resultados, a veces dos, a veces uno... pero no consigo eliminar las repeticiones  :-(

¿Cómo podría arreglarse? Muchas gracias, un saludo.


Título: Re: [JS] Random sin repetir
Publicado por: #!drvy en 31 Julio 2013, 20:44 pm
No entiendo porque generas dos random y esperas que coincidan ·_·

Código
  1. function selecLista(){
  2.   var zoo = ['Gato', 'Perro', 'Caballo', 'Ganso', 'Pez', 'Foca', 'Papagayo', 'Coyote', 'Milano', 'Nutria', 'Cotorra', 'Tigre'];
  3.   var lote = [];
  4.  
  5.   // Cantidad aleatoria de elementos basada en la cantidad de elemenos de la variable zoo.
  6.   var cantidad = Math.floor((Math.random()*zoo.length));
  7.  
  8.   for(var i=0; i<cantidad; i++){
  9.      // Generar un nuevo elemento.
  10.      var nuevo = zoo[Math.floor((Math.random()*zoo.length))];
  11.  
  12.      // Si el elemento no se encuentra en lote[] agregar (push), en caso
  13.      // de que sea se encuentre (continue;), saltar al siguente.
  14.      if(lote.indexOf(nuevo)!=-1){continue;} else {lote.push(nuevo);}
  15.   }
  16.   document.write(lote);
  17. };
  18. selecLista();

Saludos


Título: Re: [JS] Random sin repetir
Publicado por: 1mpuls0 en 31 Julio 2013, 20:57 pm
Bueno ya tienes dos alternativas.

e.e la cantidad tambien era aleatoria? xD

Código
  1.  
  2.        var zoo = ['Gato', 'Perro', 'Caballo', 'Ganso', 'Pez', 'Foca', 'Papagayo', 'Coyote', 'Milano', 'Nutria', 'Cotorra', 'Tigre'];
  3. var cantidad = 4;
  4.  
  5. seleccionar(cantidad, zoo);
  6.  
  7. function seleccionar(cantidad, zoo) {
  8. this.cantidad = cantidad;
  9. this.zoo = zoo;
  10.  
  11. var tamano = zoo.length;
  12. var lote = new Array();
  13.  
  14. var indice = 0;
  15. do {
  16. var aleatorio = zoo[parseInt(Math.random()* tamano)];
  17. if(lote.indexOf(aleatorio)!=-1){
  18. continue;
  19. }else{
  20.            lote[indice]=aleatorio;
  21.            indice++;
  22.              }
  23. } while(lote.length < cantidad);
  24.  
  25. alert(lote);
  26. }
  27.  
  28.  

Saludos.


Título: Re: [JS] Random sin repetir
Publicado por: Linton en 31 Julio 2013, 21:11 pm
No entiendo porque generas dos random y esperas que coincidan ·_·

¡Qué torpe!  :-[ Creí que no estaba generando otro random, sino citando el anterior.

¡Muchas gracias por tu ayuda!  :-)


Título: Re: [JS] Random sin repetir
Publicado por: Linton en 31 Julio 2013, 21:23 pm
e.e la cantidad tambien era aleatoria? xD

No, yo la había fijado en el for. Pero da igual, lo que me importa es que no se repitan :-)

Uf en tu solución hay varias cosas que desconozco... Bueno, a estudiarla también :-)

¡Gracias mil por tu ayuda!


Título: Re: [JS] Random sin repetir
Publicado por: Almapa en 1 Agosto 2013, 01:34 am
Aquí va una posible solución para que no se repitan y con una longitud aleatoria que se puede determinar con el límite superior del bucle "for".

Código
  1. function selecLista() {
  2.    var zoo=['Gato','Perro','Caballo','Ganso','Pez','Foca','Papagayo','Coyote','Milano','Nutria','Cotorra','Tigre'];     //Array que contiene las palabras que pueden salir
  3.    var zoo2=new Array;    //Array con la misma longitud que la de "zoo" que tendra el valor 1 en la posición de la palabra que haya salido anteriormente
  4.    var lote=new Array;     //Array con los valores finales
  5.    var x;     //Variable estilo puntero que apuntará la posición del array que se pretende colocar para comprobar si ha sido puesta anteriormente o no.
  6. for(var k=0;k<Math.floor(Math.random()*zoo.length)+1;k++){     //Bucle for desde 0 hasta como máximo la longitud del array que contiene las palabras, es decir, la longitud de la variable lote podrá variar entre 1 y la longitud de la variables "zoo".  
  7.        x=Math.floor(Math.random()*zoo.length);     //Se apunta a una posición del Array "zoo"
  8.        while(zoo2[x]==1){     //Se comprueba que no haya estado colocada anteriormente
  9.            x=Math.floor(Math.random()*zoo.length);     //Si ha estado puesta anteriormente se apunta a otra posición.
  10.        }
  11.        lote[k]=zoo[x];     //Una vez se tiene una palabra no puesta anteriormente se añade al "lote"
  12.        zoo2[x]=1;     //Se registra que ha sido puesta en el array de registro.
  13.    }
  14.    document.write(lote);     // Se muestra la variable
  15. };
  16. selecLista()


Si utilizas esta función varias veces en el mismo proceso es posible que, tras la línea que muestra la variable, tengas que inicializar las variables "lote" y "zoo2".

Un saludo!


Título: Re: [JS] Random sin repetir
Publicado por: #!drvy en 1 Agosto 2013, 03:08 am
Aquí va una posible solución para que no se repitan y con una longitud aleatoria que se puede determinar con el límite superior del bucle "for".

Si utilizas esta función varias veces en el mismo proceso es posible que, tras la línea que muestra la variable, tengas que inicializar las variables "lote" y "zoo2".

Un saludo!

No entiendo la necesidad de declarar 1 array innecesario (zoo2) y dos bucles cuando se puede hacer perfectamente con un solo bucle (con un if) y un solo array que almacene las palabras necesarias...

Saludos


Título: Re: [JS] Random sin repetir
Publicado por: 1mpuls0 en 1 Agosto 2013, 04:07 am
No entiendo la necesidad de declarar 1 array innecesario (zoo2) y dos bucles cuando se puede hacer perfectamente con un solo bucle (con un if) y un solo array que almacene las palabras necesarias...

Saludos

y 3 RAND :P



Título: Re: [JS] Random sin repetir
Publicado por: Almapa en 1 Agosto 2013, 12:33 pm
Toda la razón, no había visto lo que hacía la función index.Of.
Aquí mi corrección:

Código
  1. function selecLista() {
  2.    var zoo=['Gato','Perro','Caballo','Ganso','Pez','Foca','Papagayo','Coyote','Milano','Nutria','Cotorra','Tigre'];
  3.    var lote=new Array;
  4.    var x;
  5. for(var k=0;k<parseInt(Math.random()*zoo.length+1);k++){  
  6.        x=parseInt(Math.random()*zoo.length);
  7.        while(lote.indexOf(zoo[x])!=-1){
  8.            x=parseInt(Math.random()*zoo.length);
  9.        }
  10.        lote[k]=zoo[x];
  11.    }
  12.    document.write(lote);
  13. };
  14. selecLista()