[JS] Random sin repetir

Iniciado por Linton, 30 Julio 2013, 22:36 PM

0 Miembros y 1 Visitante están viendo este tema.

Almapa

#10
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 (javascript) [Seleccionar]
function selecLista() {
   var zoo=['Gato','Perro','Caballo','Ganso','Pez','Foca','Papagayo','Coyote','Milano','Nutria','Cotorra','Tigre'];     //Array que contiene las palabras que pueden salir
   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
   var lote=new Array;     //Array con los valores finales
   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.
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".  
       x=Math.floor(Math.random()*zoo.length);     //Se apunta a una posición del Array "zoo"
       while(zoo2[x]==1){     //Se comprueba que no haya estado colocada anteriormente
           x=Math.floor(Math.random()*zoo.length);     //Si ha estado puesta anteriormente se apunta a otra posición.
       }
       lote[k]=zoo[x];     //Una vez se tiene una palabra no puesta anteriormente se añade al "lote"
       zoo2[x]=1;     //Se registra que ha sido puesta en el array de registro.
   }
   document.write(lote);     // Se muestra la variable
};
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!

#!drvy

Cita de: 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".

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

1mpuls0

Cita de: drvy | BSM en  1 Agosto 2013, 03:08 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

abc

Almapa

Toda la razón, no había visto lo que hacía la función index.Of.
Aquí mi corrección:

Código (javascript) [Seleccionar]
function selecLista() {
    var zoo=['Gato','Perro','Caballo','Ganso','Pez','Foca','Papagayo','Coyote','Milano','Nutria','Cotorra','Tigre'];
    var lote=new Array;
    var x;
for(var k=0;k<parseInt(Math.random()*zoo.length+1);k++){   
        x=parseInt(Math.random()*zoo.length);
        while(lote.indexOf(zoo[x])!=-1){
            x=parseInt(Math.random()*zoo.length);
        }
        lote[k]=zoo[x];
    }
    document.write(lote);
};
selecLista()