0

配列を一意の数字で埋めるコードを書こうとしています。

1 次元、2 次元、3 次元の配列のコードを別々に書くことはできますが、forサイクル数は「無限」に増加します。

これは 2D 配列のコードです。

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次元配列に対してこのようなことを行うことは可能ですか?

4

3 に答える 3

0

最初の 2 つの for ループでは、配列を適切に分析しています (i対応jする次元の最初から最後まで移動します)。問題は、実際に の無限ループを引き起こす「修正」を導入する最も内部の部分にありますj

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) に依存する必要があります。

  int j2 = j;
  for (int k = 0; k < j2; k++)
       if (array[i, k] == array[i, j2])
         j2--;
于 2013-07-14T15:02:36.717 に答える
0

私のアプローチは、シャッフルできる一意の数値の 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 次元配列に連続番号を割り当てますが、必要に応じて別の戦略を採用することもできます。

于 2013-07-14T15:17:07.453 に答える