algorithm - rifas - Crear una lista ordenada al azar de una lista ordenada
random programa (7)
Depende de lo que necesita para "aleatoriedad". La forma más fácil es probablemente pasar todos los elementos en un conjunto de hash e iterar sobre el resultado. El orden que obtenga será determinista, pero para la mayoría de los intentos y propósitos puede considerarse aleatorio. Alternativamente, puede generar números aleatorios entre [0..length] de la lista, seleccionando elementos y empujándolos a una nueva lista. Suponiendo que la eliminación de la lista sea a tiempo constante, el resultado sería una lista aleatoria generada con la eficiencia O (n).
Tengo una aplicación que toma los resultados de calidad para un proceso de fabricación y crea gráficos para mostrar los gráficos de Pareto de los malos, y también para mostrar el rendimiento de producción.
Para automatizar la tarea de probar estos procedimientos estadísticos, me gustaría determinar de manera determinista registros en la base de datos y hacer que la tecnología de calidad vaya a ciertos gráficos y compararlos con un gráfico bueno conocido. Pero también me gustaría simular los resultados para que entren en la base de datos como si un usuario estuviera ejecutando el proceso de prueba.
Una idea que he tenido es completar una lista con números buenos, j número bad1, k número malo 2, etc. Y de alguna forma ordenar la lista al azar antes de insertarla en la base de datos.
Entonces, mi pregunta, ¿hay un algoritmo estándar para tomar una lista ordenada de valores y crear una lista ordenada aleatoriamente?
Hay algunas implementaciones listas disponibles como http://msdn.microsoft.com/en-us/library/bb385047.aspx y http://java.sun.com/javase/6/docs/api/java/util/Collections .html # shuffle (java.util.List)
Nuestro anfitrión tiene un muy buen artículo sobre la baraja de cartas, creo que se pueden adoptar algunas buenas ideas
http://www.codinghorror.com/blog/archives/001008.html
Una respuesta simple es tener una matriz o vector, recorrer una vez, y para cada posición visitada, elegir un elemento al azar del resto de la lista e intercambiarlo con el elemento actual.
Necesita un generador de números aleatorios razonable para esto.
la forma en que solía hacer esto era tener un ciclo que se ejecutaba varias veces que generaría dos números aleatorios entre 0 y la longitud de la lista, luego intercambia esos dos elementos.
Random rnd = new Random();
List<int> orderedList = new List<int>();
List<int> randomList = new List<int>();
while (orderedList.Count != 0)
{
int index = rnd.Next(0, orderedList.Count);
randomList.Add(orderedList[index]);
orderedList.RemoveAt(index);
}
Querrá usar un algoritmo de mezcla. Asegúrese de usar un algoritmo aleatorio adecuado y no uno casero, porque puede introducir algún tipo de patrón sutil en los datos. Mira esta publicación de Jeff Atwood sobre el problema del uso aleatorio de barajados.