Как рандомизировать двумерные массивы в 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 число столбцов.