Мой подход состоит в том, чтобы начать с 1-го массива уникальных чисел, которые вы можете перетасовать, а затем сложить в соответствующие места в вашем реальном массиве.
Вот основные функции:
private static void Initialize(Array array)
{
var rank = array.Rank;
var dimensionLengths = new List<int>();
var totalSize = 1;
int[] arrayIndices = new int[rank];
for (var dimension = 0; dimension < rank; dimension++)
{
var upperBound = array.GetLength(dimension);
dimensionLengths.Add(upperBound);
totalSize *= upperBound;
}
var singleArray = new int[totalSize];
for (int i = 0; i < totalSize; i++) singleArray[i] = i;
singleArray = Shuffle(singleArray);
for (var i = 0; i < singleArray.Length; i++)
{
var remainingIndex = i;
for (var dimension = array.Rank - 1; dimension >= 0; dimension--)
{
arrayIndices[dimension] = remainingIndex%dimensionLengths[dimension];
remainingIndex /= dimensionLengths[dimension];
}
// Now, set the appropriate cell in your real array:
array.SetValue(singleArray[i], arrayIndices);
}
}
Ключ в этом примере является array.SetValue(value, params int[] indices)
функция. Создав правильный список индексов, вы можете использовать эту функцию для установки произвольной ячейки в вашем массиве.
Вот Shuffle
функция:
private static int[] Shuffle(int[] singleArray)
{
var random = new Random();
for (int i = singleArray.Length; i > 1; i--)
{
// Pick random element to swap.
int j = random.Next(i); // 0 <= j <= i-1
// Swap.
int tmp = singleArray[j];
singleArray[j] = singleArray[i - 1];
singleArray[i - 1] = tmp;
}
return singleArray;
}
И, наконец, демонстрация ее в использовании:
var array1 = new int[2,3,5];
Initialize(array1);
var array2 = new int[2,2,3,4];
Initialize(array2);
Моя стратегия присваивает порядковые номера к первоначальному 1-й массив, чтобы обеспечить уникальность, но вы можете принять другую стратегию для этого, как вы сочтете нужным.
Ваш код проверяет только то, что число уникально в пределах одного и того же фрагмента массива. Это намерение, или число должно быть уникальным во всем массиве? – Guffa
взлеты. Я этого никогда не замечал. Ты прав. Он должен быть уникальным во всем массиве. – mishonacro