Случайный двумерный массив неповторяющихся чисел c #

1

Я сделал двумерный массив в С# со случайными числами, но я хочу, чтобы числа не повторялись. Например, успешный вывод, дающий вход 4 (x), 4 (y), 15 (maxElem), будет:

14 | 8 | 1 | 7

3 | 13 | 2 | 4

2 | 6 | 12 | 8

10 | 9 | 4 |

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TwoDimensionArray
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 4;
            int y = 4;
            int[,] z = new int[x, y];

            Random r = new Random();
            for (int i = 0; i < x; i++)
            {
                for (int j = 0; j < y; j++)
                {
                    z[i, j] = r.Next(1, 15);
                }
            }
            for (int i = 0; i < x; i++)
            {
                for (int j = 0; j < y; j++)
                {
                    if (i == 3 && j == 3)
                    {
                        Console.Write("  ");
                        break;
                    }
                    else
                    {
                         if (z[i, j] > 9)
                            Console.Write(z[i, j] + " ");
                         else
                            Console.Write(z[i, j] + "  ");
                    }
                }
                Console.WriteLine();
            }
            Console.ReadKey();
        }
    }
}
  • 0
    У вас есть проблема с вашим текущим кодом, которую вы, возможно, не поняли - генерируя случайные числа с помощью r.Next(1, 15) вы получаете значения только от 1 .. 14 поскольку второй параметр является исключительной верхней границей. Таким образом, пытаясь сгенерировать 16 номеров из пула, состоящего только из 14, вы получаете дубликаты .
Теги:
arrays
random

2 ответа

1

Создайте массив, содержащий допустимые числа, затем используйте алгоритм тасования, чтобы рандомизировать порядок в массиве, а затем, наконец, заполнить ваш двумерный массив, извлекая по порядку значения из вашего перетасованного массива.

0

Попробуйте сделать это следующим образом:

int x = 4;
int y = 4;
int[,] z = new int[x, y];

Random r = new Random();

var values =
    Enumerable
        .Range(1, x * y)
        .OrderBy(n => r.Next())
        .ToArray();

for (int i = 0; i < x; i++)
{
    for (int j = 0; j < y; j++)
    {
        z[i, j] = values[i * 4 + j];
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню