首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中用唯一数字填充多维数组

在C#中用唯一数字填充多维数组
EN

Stack Overflow用户
提问于 2013-07-14 14:35:26
回答 3查看 1.7K关注 0票数 0

我正在尝试编写一个代码,它将用唯一的数字填充数组。

我可以分别为1、2和3维数组编写代码,但是for循环的数目会增加到“无穷大”。

这是2D数组的代码:

代码语言:javascript
复制
static void fillArray(int[,] array)
        {
            Random rand = new Random();

            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    array[i, j] = rand.Next(1, 100);
                    for (int k = 0; k < j; k++)
                        if (array[i, k] == array[i, j])
                            j--;
                }
            }

            print_info(array);
        }

n-dimensional数组可以这样做吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-14 15:17:07

我的方法是从一个唯一数字的一维数组开始,您可以对其进行洗牌,然后将其插入到实际数组中的适当位置。

以下是主要功能:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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;
}

最后,展示它在使用中的情况:

代码语言:javascript
复制
var array1 = new int[2,3,5];
Initialize(array1);
var array2 = new int[2,2,3,4];
Initialize(array2);

我的策略将序号分配给原始的一维数组,以确保唯一性,但您可以根据需要采用不同的策略。

票数 0
EN

Stack Overflow用户

发布于 2013-07-14 14:41:32

可以使用排名属性获取数组中的总维数。

要插入使用SetValue方法

票数 0
EN

Stack Overflow用户

发布于 2013-07-14 15:02:36

在前两个for循环中,您正在正确地分析数组(ij从对应维度的开始到结束)。问题出现在最内部的部分,您引入了一个“更正”,它实际上引发了j的一个没完没了的循环。

代码语言:javascript
复制
First iteration:
- First loop: i = 0;
- Second loop: j = 0;
- Third loop: j = -1

Second iteration
- First loop: i = 0;
- Second loop: j = 0;
- Third loop: j = -1
. etc., etc.

(我在第一次使用内部循环的时候开始我的分析。也要记住,只要涉及到随机数,就不能预测确切的行为。但是我们的想法是,通过遵循任意的规则,您将一次又一次地重复使用j计数器)。

你到底想完成什么?这最后一次修正(引发无穷无尽的循环)意味着什么?

如果您要做的唯一事情是检查以前存储的值,那么您必须依赖一个不同的变量(例如,j2),它不会影响上述任何一个循环:

代码语言:javascript
复制
  int j2 = j;
  for (int k = 0; k < j2; k++)
       if (array[i, k] == array[i, j2])
         j2--;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17640336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档