es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo se itera aleatoriamente a través de una matriz 2D sin duplicados?

Normalmente se puede iterar a través de una matriz 2D con dos bucles for:

For i = 0 to 5
   For j = 0 to 5
      Console.Writeline(Arr(i,j))
   Next
Next

Necesito iterar a través de una matriz 2D (con bordes cuadrados, es decir, mismas longitudes en ambos lados, por ejemplo, 5×5, 7×7, etc.), pero necesito hacerlo de forma completamente aleatoria y sin duplicación de los mismos elementos.

For Each i In iRandArr
   For Each j In jRandArr
      Console.Writeline(arr(iRandArr(j), jRandArr(i)))
   Next
Next
'nota: los elementos i y j están intercambiados arriba para mantener la nomenclatura de "columna", "fila"

Ya he intentado hacer esto al enviar las longitudes de cada lado a una lista, mezclándola (es decir, desordenándola, ver aquí), y luego iterar a través de ella de la misma forma de doble bucle for. En lugar de iterar de forma aleatoria, este método desafortunadamente itera de manera semi-aleatoria seleccionando una “columna” aleatoria y recorriendo las “filas” de manera aleatoria. El único problema con esto es que la iteración está limitada por el elemento de la columna, por lo que no es realmente aleatoria (en sentido programático).

¿Alguien tiene alguna otra opción posible que pueda intentar?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, sugiero utilizar una lista de índices generada aleatoriamente que represente cada elemento en la matriz 2D exactamente una vez. Luego, utiliza un solo ciclo for para iterar a través de la matriz utilizando cada índice de la lista. Aquí tienes un ejemplo en vb.net:

    Dim indices As New List(Of Integer)
    Dim arrSize As Integer = arr.GetLength(0) 'Suponiendo que la matriz 2D es cuadrada.
    For i As Integer = 0 To arrSize - 1
        For j As Integer = 0 To arrSize - 1
            indices.Add(i * arrSize + j)
        Next
    Next
    indices = indices.OrderBy(Function() Rnd.Next()).ToList() 'Aleatoriza la lista.
    For Each index As Integer In indices
        Dim i As Integer = index \ arrSize
        Dim j As Integer = index Mod arrSize
        Console.WriteLine(arr(i, j))
    Next
    

    Aquí, primero creamos una lista de índices que representan cada elemento en la matriz 2D. Luego, aleatorizamos la lista utilizando OrderBy y la función Random. Finalmente, iteramos a través de la lista de índices y utilizamos la división entera y el módulo para calcular los índices de fila y columna para cada elemento. Este método garantiza una iteración completamente aleatoria sin duplicados.

Comments are closed.