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

为什么不直接打乱数组然后遍历它呢?这很简单;这是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 shuffle更轻松地对 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 回答