我想创建多个int数组(在C#中)。但是,它们都必须在索引中具有唯一数字,其中没有其他数组在该索引中具有该数字。所以让我试着告诉你我的意思:
int[] ints_array = new int[30];
for (int i = 0; i < ints_array.Count(); i++)
ints_array[i] = i;
//create a int array with 30 elems with each value increment by 1
List<int[]> arrayList = new List<int[]>();
for(int i = 0; i < ints_array.Count(); i++)
arrayList.Add(ints_array[i]. //somehow sort the array here randomly so it will be unique
所以我试图让arrayList有30个int []数组,每个数组都被排序,所以没有数组在与另一个相同的索引中具有相同的int。
示例:
arrayList[0] = {5,2,3,4,1,6,7,8,20,21... etc }
arrayList[1] = {1,0,5,2,9,10,29,15,29... etc }
arrayList[2] = {0,28,4,7,29,23,22,17... etc }
那么这可能以这种独特的方式对数组进行排序吗?如果您需要更多信息,请询问并填写您的信息:)
答案 0 :(得分:2)
使用偏移模式迭代创建数组会不会更容易吗?
我的意思是,如果您使用1-30创建第一个数组,其中1位于索引0,则下一个数组可以使用2-30重复此操作,其中2位于索引0处,然后回绕为1并开始计数一旦你超过30,就会再次前进。这将是一种简单且可重复的方法,以确保没有数组共享相同的值/索引对。
答案 1 :(得分:1)
你可以这样做:
List<int[]> arrayList = new List<int[]>();
Random rnd = new Random();
for (int i = 0; i < ints_array.Length; i++)
{
ints_array = ints_array.OrderBy(x => rnd.Next()).ToArray();
var isDuplicate = arrayList.Any(x => x.SequenceEqual(ints_array));
if (isDuplicate)
{
while (arrayList.Any(x => x.SequenceEqual(ints_array)))
{
ints_array = ints_array.OrderBy(x => rnd.Next()).ToArray();
}
}
arrayList.Add(ints_array);
}
我认为,对于比30
更大的数字,这不会那么有效。但在这种情况下它不应该是一个问题,在我的机器中需要 7毫秒。
答案 2 :(得分:1)
答案 3 :(得分:1)
使用矩阵(2D阵列)。它比数组列表更容易处理。创建一个随机数生成器。确保只初始化一次,否则随机数生成器可能会创建错误的随机数,如果在太短的时间间隔内创建,因为慢速PC时钟可能没有勾选。 (实际时间用作种子值)。
private static Random random = new Random();
为行和列创建两个带有双驱动索引的辅助数组:
const int N = 30;
int[] col = CreateUniqueShuffledValues(N);
int[] row = CreateUniqueShuffledValues(N);
然后使用支撑的行和列索引创建并初始化矩阵:
// Create matrix
int[,] matrix = new int[N, N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
matrix[row[i], col[j]] = (i + j) % N;
}
}
代码使用这两个辅助方法:
private static int[] CreateUniqueShuffledValues(int n)
{
// Create and initialize array with indexes.
int[] array = new int[n];
for (int i = 0; i < n; i++) {
array[i] = i;
}
// Shuffel array using one variant of Fisher–Yates shuffle
// http://en.wikipedia.org/wiki/Fisher-Yates_shuffle#The_modern_algorithm
for (int i = 0; i < n; i++) {
int j = random.Next(i, n);
Swap(array, i, j);
}
return array;
}
private static void Swap(int[] array, int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
答案 4 :(得分:-1)
int size = 10;
// generate table (no duplicates in rows, no duplicates in columns)
// 0 1 2
// 1 2 0
// 2 0 1
int[,] table = new int[size, size];
for (int y = 0; y < size; y++)
for (int x = 0; x < size; x++)
table[y, x] = (y + x) % size;
// shuffle rows
Random rnd = new Random();
for (int i = 0; i < size; i++)
{
int y1 = rnd.Next(0, size);
int y2 = rnd.Next(0, size);
for (int x = 0; x < size; x++)
{
int tmp = table[y1, x];
table[y1, x] = table[y2, x];
table[y2, x] = tmp;
}
}
// shuffle columns
for (int i = 0; i < size; i++)
{
int x1 = rnd.Next(0, size);
int x2 = rnd.Next(0, size);
for (int y = 0; y < size; y++)
{
int tmp = table[y, x1];
table[y, x1] = table[y, x2];
table[y, x2] = tmp;
}
}
// sample output
for (int y = 0; y < size; y++)
{
for (int x = 0; x < size; x++)
Console.Write("{0} ", table[y, x]);
Console.WriteLine();
}