来自阵列的随机图像无需重复

时间:2013-05-30 04:38:35

标签: c#

使用:

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要输出,但不超过每个的数量。我尝试过的所有内容最终都会出现更多其他图像,而没有图像1或多个图像1。

我用数字做了这个,这往往不是问题,但我无法弄清楚图像。此外,我无法在列表中随机播放图像而无需重复。

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分:2)

使用LINQ,您可以比使用Fisher-Yates shuffle更轻松地改组IEnumerable(数组是)。它就像

一样简单
var shuffledList = sourceList.OrderBy(_ => rng.Next());

其中rngrandom number generator(务必记住Random correctly)。

您的代码看起来像这样

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)
{
    //...
}