Aprovechando que aún estamos vivos, quise resolver el planteo de asegurarnos el recorrido por todos los banners antes de volver a pasarlos. Claro que eso ya estába asegurado, por ejemplo, al retirar del conjunto cada uno de los que mostrábamos para meterlo en uno nuevo. Cuando el primero se termina, lo reemplazamos con el segundo que queda entonces vacío; y empezamos de nuevo.
Las objeciones son que eligiendo al azar puede repetirse el último de la vuelta anterior con el primero de la siguiente. Pero como en javascript podemos "saber" cuando se cambia de conjunto o array, con hacer la comparación antes de empezar la nueva secuencia ya podemos mandar el elegido de nuevo al conjunto (en otra posición) y entonces sí recomenzar la rotación.
Otra objeción, que es la que me dejó pensando, es la de cómo mezclar lo "suficiente" para que la misma imagen entre una secuencia y la otra no estuviesen cerca, y que no diese la impresión de que alguna pasa "dos veces" antes que otra (recordemos que no hay una marca para saber dónde termina una serie y empieza la otra, y para quien mira, "su secuencia" empieza con la imagen a la que llegó a prestarle atención primero).
Por supuesto; este problema no tiene solución. Lo único que podemos hacer si la cantidad de banners es muy grande, es ordenarlos en todas las combinaciones posibles y pasar siempre esa misma serie. Ya no sería aleatoria, pero estaría bien repartida. Y como son muchos, nadie se va a acordar de cómo vienen ... por lo que parece al azar.
Si fuese una combinación, el cálculo es medianamente sencillo. Ya lo hicimos en el foro varias veces.
permutaciones Todas las combinaciones posibles de 012 ej 111, 101, 121..
Pero como son permutaciones sin repetición, el cálculo de la cantidad es facil, si son 4 baners sólo hay 24 combinaciones posibles
Banners₍₄,₄₎
4 × 3 × 2 × 1 = 24
Extraer de la cantidad de combinaciones posibles sólo las que no tienen ninguna imagen repetida, ya no me salió.
Pero no es que no se pueda. A lo bruto sale (en un enlace que hay más arriba,
maycolalvarez linkea un ejemplo). Yo pretendía resolverlo con una 'fórmula'. Basado en la lista que se crea con
parseInt("333",4).
Como no pude, aprovecho el post para mencionar otro caso de rotación, donde no se muestra una sino varias imágenes juntas, y no deben repetirse entre ellas.
Creación código para poner 3 imágenes aleatoria Transición de cinco imágenes.