Este es el código:
Código C#:
Ver original
public class SetPermutation { private const string SET = "123456789"; private bool[,] used; private Random randomizer; public SetPermutation() { randomizer = new Random(); } public string Next() { int num; bool valid; string p = ""; string possiblevalues = SET; CreateUsedArray(); for (int i = 0; i < SET.Length; i++) { valid = false; do { num = int.Parse(possiblevalues[randomizer.Next(0, possiblevalues.Length - 1)].ToString()); if (!used[num - 1, i]) { p += num.ToString(); possiblevalues = possiblevalues.Remove(possiblevalues.IndexOf(num.ToString()), 1); used[num - 1, i] = true; valid = true; } } while (!valid); } return p; } private void CreateUsedArray() { used = new bool[Match.GRIDSIZE, Match.GRIDSIZE]; for (int i = 0; i < Match.GRIDSIZE; i++) { for (int j = 0; j < Match.GRIDSIZE; j++) { used[i, j] = false; } } } }
El algoritmo que uso es muy simple. Por cada posicion que debo llenar en la cadena p, busco un número que no haya sido usado en esa posición y tampoco en el resto de la cadena. La variable possiblevalues es la que utilizo para esto.
Mi problema está en esta línea:
num = int.Parse(possiblevalues[randomizer.Next(0, possiblevalues.Length - 1)].ToString());
En esta línea obtengo una posición aleatoria para extraer el caracter de possiblevalues en esta posición. El problema es que primero me elige de manera aleatoria las primeras 8 posiciones y siempre queda para el final la última. Para que lo vean con un ejemplo:
possiblevalues se inicia siempre con "123456789" las permutaciones que me devuelve pueden ser 428753619, 847562319, xxxxxxxx9.
Pero si inicio possiblevalues con "123456798" las permutaciones que me devuelve pueden ser como 195347628, 245769138, xxxxxxxx8.
Siempre me deja el último caracter para el final.
No sé si este es un error en el algoritmo o bien es de algún comportamiento de la función del objeto Random.
Voy a agradecer cualquier tipo de sugerencia que puedan darme.
Saludos.