Creo que estamos en uno de esos casos en los que la función debe de ser ajustada al objetivo a lograr. Aquí la universabilidad no cabe.
Las funciones que se han mostrado funcionan bien, algunas más optimizadas que otras, pero todas cumplen su cometido
Hacer un random sin repetición, de acuerdo, pero para que?
Dos casos típicos,
el reparto de una baraja, las cartas se reparten al azar y obviamente no puede haber 2 cartas iguales
un sorteo (con premios del uno al diez) en los que obtenemos 10 ganadores, con numeros que no pueden repetirse
Pero aquí se partió de un ejemplo aplicado al uso de baners rotativos, que deben ser distribuidos equitativamente en la presentación, ya no estamos hablando de un array que se mezcla y recorre al azar tan solo una vez (las cartas vuelven al mazo para ser mezcladas una vez terminada la partida) sino que estamos repitiendo el ciclo. Podemos como mucho solucionar el problema de que el primer banner del 2º ciclo sea el mismo que el último del 1º. En ese contexto lograr una "equidad" completa en la muestra de los banners es practicamente
imposible, esta solo será conseguida si los mismos se muestran secuencialmente en el orden original.
Me pregunté entonces cual sería la mejor opción a utilizar en este caso, es decir para crear un
rotador aleatorio sin repetición pocas imágenes (o muchas, sería lo mismo), y mantener la distribución "equitativa", que es el punto fundamental. Sin desmerecer para nada los excelentes trabajos que han expuesto, sencillamente, mezclaría nuestro array de imágenes al cargar la página y luego lo recorería
sin volver a mezclarlo, una y otra vez
Código HTML:
Ver original<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <script type="text/javascript"> //<![CDATA[
var mezclar = function(n){
for(var j, x, i = n.length; i; j = Math.floor(Math.random() * i), x = n[--i], n[i] = n[j], n[j] = x);
return n;
}
var banners = ['1', '2', '3', '4', '5', '6', '7'];
mezclar(banners);
var banner_actual = 0;
var Cambiar = function(){
var p= "";
if (banner_actual == banners.length) {
banner_actual = 0;
}
var cambio =banner_actual++;
if(cambio === 6){
p = "<br \/>";
}
document.getElementById('banner').innerHTML += banners[cambio] + '<br \/>' + p;
var t = setTimeout(Cambiar, 1000);
}
window.onload = Cambiar;
//]]>
<div id="banner"><!-- banners --></div>
Espero se entienda la idea
Saludos