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".
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!