Llenar matriz aleatoriamente sin repetir números

publicado por: Anonymous

Quisiera aprender cómo llenar esta matriz de 10×10 pero sin que se repitan los números, este es mi código

int posi = 0, posj = 0, mayor = 0;//declaracion de variables para la posicion y el numero mayor

        Console.WriteLine("Matriz de 10*10n");

        int[,] matriz = new int[11, 11];  //Creacion de la matriz de 10*10 (10filas, 10 columnas)
        Random aleatorio = new Random();//declaracion del random para llenar la matriz 

        //se recorre la matriz para asignar los valores
        for (int i = 0; i < 10; i++)
            for (int j = 0; j < 10; j++)
            {
                matriz[i, j] = aleatorio.Next(0, 100);
            }


        // se recorre nuevamente para leer sus valores y validar cual es mayor y capturar su respectiva posicion
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    if (matriz[i, j] > mayor)//si matriz en la posicion i,j es > mayor
                    {
                        mayor = matriz[i, j]; // a mayor -> el valor que hay en la posicion i, j
                        posi = i; // a la posicion i -> i
                        posj = j;// a la posicion j -> j
                    }
                    //imprimir matriz  
                    Console.Write(matriz[i, j].ToString() + " ");
                }
            Console.WriteLine();

solución

Puedes utilizar un HasSet que que almacene inicialmente los 100 numeros de forma aleatoria y posteriormente volcarlos a la matriz, de esta forma tu código queda optimizado al realizar un solo recorrido de la matriz

algo como

class Program
{
    static void Main(string[] args)
    {

        int columnas = 4;
        int filas = 4;
        int maxvalues = filas * columnas;
        int[,] matris = new int[filas, columnas]; 
        HashSet<Int32> numeros = new HashSet<Int32>();

        Random ran = new Random();

        while(numeros.Count < maxvalues)
        {
            numeros.Add(ran.Next(maxvalues));
        }

        Console.WriteLine(numeros.Count);
        foreach(int n in numeros)
        {
            Console.WriteLine(n);
        }

        Console.Read();
    }
}

De esta forma no tienes que hacer una funcion de validación para saber si un número ya fue almacenado o no, ya que el HashSet no almacena duplicados, posteriormente recorres el HashSet y lo almacenas en la matriz.
El HashSet es una colección no ordenada que no permite duplicados.

Otra solución alternativa puede ser

class Program
{
    static void Main(string[] args)
    {
        int filas = 4;
        int columnas = 4;
        int maxvalues = filas * columnas;

        ArrayList numerosOrdenados = new ArrayList();
        ArrayList numerosDesordenados = new ArrayList();
        int[,] matriz = new int[filas, columnas];

        //Se llenan los numeros de forma ordenada
        for (int i = 0; i < maxvalues; i++)
        {
            numerosOrdenados.Add(i);
        }

        Random ran = new Random();

        //Se desorganizan
        while(numerosOrdenados.Count > 0)
        {
            int index = ran.Next(numerosOrdenados.Count);
            numerosDesordenados.Add(numerosOrdenados[index]);
            numerosOrdenados.RemoveAt(index);
        }

        //llenar matriz
        for(int i = 0; i < numerosDesordenados.Count; i++)
        {
            int f = i / filas;
            int c = i % filas;

            matriz[f, c] = (int)numerosDesordenados[i];

        }

        Console.Read();
    }
}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *