Как рандомизировать двумерные массивы в C#

В этом примере используется следующий метод расширения для рандомизации двумерных массивов.

// Рандомизируем 2D-массив.
public static void Randomize(this T[,] values)
{
    // Получить размеры.
    int num_rows = values.GetUpperBound(0) + 1;
    int num_cols = values.GetUpperBound(1) + 1;
    int num_cells = num_rows * num_cols;

    // Рандомизируем массив.
    Random rand = new Random();
    for (int i = 0; i < num_cells - 1; i++)
    {
        // Выберите случайную ячейку между i и концом массива.
        int j = rand.Next(i, num_cells);

        // Преобразование в индексы строк / столбцов.
        int row_i = i / num_cols;
        int col_i = i % num_cols;
        int row_j = j / num_cols;
        int col_j = j % num_cols;

        // Обмен ячейками i и j.
        T temp = values[row_i, col_i];
        values[row_i, col_i] = values[row_j, col_j];
        values[row_j, col_j] = temp;
    }
}

Чтобы рандомизировать двумерные массивы, код начинается с получения количества строк и столбцов в массиве и путем вычисления общего количества элементов, содержащихся в массиве. Затем он перебирает все ячейки массива с номером 0 через число элементов минус 1. Например, если массив имеет 20 элементов, тогда цикл работает от 0 до 19.

Для каждого индекса i в этом цикле код выбирает случайный индекс j больше или равен i. Затем код заменяет элементы на индексы i и j.

Единственный трюк здесь - вычисление строки и столбца для индексов i и j. Чтобы найти строку, код делит индекс на число столбцов в каждой строке. Поскольку все значения в вычислении являются целыми числами, деление является целым делением, поэтому результат усекается. Чтобы найти столбец, код принимает индекс mod число столбцов.

Источник: http://csharphelper.com/blog/2016/10/randomize-two-dimensional-arrays-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector