1

使用:

Image[] icons = { image12, image9, image11, image12, image10, image9, image11, image1,  image12, image9, image11, image10, image12, image9, image10, image11, image9, image10, image12, image11 };
    for (int i = 0; i < 20; i++)
    {
        newicon[i] = icons[rnd.Next(0, 19)];
    }

「アイコン」のリストを取得して、繰り返さずにスクランブルしようとしています

基本的に、出力には1つのimage1、5つのimage9、4つのimage10、5つのimage11、および5つのimage12が必要ですが、それぞれの量を超えてはなりません。私が試したことはすべて、他の画像が多くなり、image1または複数のimage1はありません。

問題になりにくい数値でこれを行いましたが、画像を把握できません。また、リスト内の画像を繰り返さずにシャッフルしても何も見つかりません。

4

2 に答える 2

5

配列をシャッフルしてから反復処理しないのはなぜですか? とても簡単です。以下は、1 回のパスで配列をシャッフルするFisher-Yates shuffleの実装です。

void Shuffle(Images[] images) {
   for (int i = 0; i < images.Length - 1; i++) {
      int j = rnd.Next(i, images.Length);
      Image temp = images[j];
      images[j] = images[i];
      images[i] = temp;
   }
}

次に、呼び出しShuffleて配列を調べます

Images[] icons = { ... };
Shuffle(icons);
for (int i = 0; i < 20; i++)
   newicon[i] = icons[i];
于 2013-05-30T04:41:34.867 に答える
2

LINQ を使用すると、 Fisher-Yates シャッフルよりも簡単に IEnumerable (配列) をシャッフルできます。それは次のように簡単です

var shuffledList = sourceList.OrderBy(_ => rng.Next());

乱数発生器rngです(必ず正しく実装してください)。Random

あなたのコードは次のようになります

private void Foo()
{
    Image[] icons = { image12, image9, image11, image12, image10, image9, image11, image1,  image12, image9, image11, image10, image12, image9, image10, image11, image9, image10, image12, image11 };
    var shuffeledIcons = icons.OrderBy(_ => rng.Next()).ToArray();

    createBoard(shuffeledIcons);
}

private void createBoard(Image[] icons)
{
    //...
}
于 2013-05-30T04:55:10.960 に答える