Aleatoria una lista (con duplicados) para evitar elementos idénticos estar uno junto al otro

StackOverflow https://stackoverflow.com/questions/358307

Pregunta

Me pregunto si hay una manera "mejor" para barajar una lista de elementos que contiene duplicados de tal manera que el caso en el array [i] == array [i + 1] se evita lo más posible.

Estoy trabajando en una pantalla de publicidad ponderada (puedo ajustar el número de pantallas por rotación para cualquier anunciante determinado) y me gustaría evitar el mismo advertister que aparece dos veces en una fila.

¿Fue útil?

Solución 5

A modo de referencia, mi (muy) enfoque ingenuo era algo como esto (en realidad el uso de LINQ llamadas / SQL, pero esto se simplifica):

var advertisers = getAdvertisers();
var returnList = new List();
int totalWeight = sumOfAllAdvertisersWeight();
while (totalWeight > 0)
{
    for (int i=0; i<advertisers.Count; i++)
    {
        if (advertisers[i].Weight > 0)
        {
            returnList.add(advertisers[i]);
            advertisers[i].Weight--;
            totalWeight--;
        }
    }
}
return returnList;

Esto evitará duplicados hasta el final, pero sí que pagaría para ver hacia atrás a través de la returnList después y si hay duplicados de asimetría, tratar de colocarlos en la mezcla anterior.

Otros consejos

Esto es bastante similar a esta pregunta . Si reemplaza A, B y C en el ejemplo dado por allí con sus anunciantes, creo que llegue al mismo problema. Tal vez algunas de las soluciones sugeridas para que uno pueda ayudarle.

aleatorización básica debería causar suficiente dispersión en un conjunto grande.

Si desea reducir al mínimo que aún más (que incluso podría no ser necesario dependiendo de los juegos), la forma más sencilla sería encontrar definitivamente el cercano engañados después de la aleatorización y moverlos (pero es posible crear patrones). Un mejor enfoque podría ser la creación de subconjuntos que contiene el lado por dupes secundarios y rehacer la aleatorización.

Para obtener un conjunto más pequeño no podría ser posible, dependiendo del número de incautos. Así que la solución para un conjunto muy pequeño sólo sería buena aleatorización básica (Y estamos de vuelta en la primera frase).

generador de n&uacute;meros randon de Dilbert

En lo personal creo que la forma más fácil de entregar esto sería asignar al azar a la matriz, y luego iterar sobre él hasta que encuentre 2 elementos con el mismo valor que están uno junto al otro. Cuando encuentre 2 de los mismos valores al lado de uno al otro, mover el posterior a otro punto de la matriz de iteración en la matriz hasta que encuentre un punto tal que no está al lado de otro del mismo valor. Si no puede encontrar un valor, simplemente dejarlo donde está, y continuar con el siguiente elemento de la matriz. Esto probablemente no sea la solución más óptima, pero va a estar bien para los conjuntos de datos más pequeños, y probablemente el más sencillo de programar.

¿Cuál es el mayor número de duplicados que pueda tener? 2, 3, cualquier?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top