Я сделал двумерный массив в С# со случайными числами, но я хочу, чтобы числа не повторялись. Например, успешный вывод, дающий вход 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();
}
}
}
Создайте массив, содержащий допустимые числа, затем используйте алгоритм тасования, чтобы рандомизировать порядок в массиве, а затем, наконец, заполнить ваш двумерный массив, извлекая по порядку значения из вашего перетасованного массива.
Попробуйте сделать это следующим образом:
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];
}
}
r.Next(1, 15)
вы получаете значения только от1 .. 14
поскольку второй параметр является исключительной верхней границей. Таким образом, пытаясь сгенерировать 16 номеров из пула, состоящего только из 14, вы получаете дубликаты .