2013-05-30 141 views
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图像1,5图像9,4 image10,5个image11和5个image12的输出,但不能超过每个的数量。我试过的所有东西都以更多的其他图像结束,并且没有image1或多个image1's。

我已经完成了这个数字,这往往不是一个问题,但我无法弄清楚图像。此外,我无法找到任何关于在重复列表中洗牌图像的问题。

回答

2

使用LINQ可以使比Fisher-Yates shuffle更容易来洗牌一个IEnumerable(这是一个数组)。这很简单,只要

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

其中rngrandom number generator(一定要implment Randomcorrectly)。

您的代码将是这个样子

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

需要注意的是,它需要'O(n ln n)'运行时间,因为它依赖于排序。Fisher-Yates是'O(n)'。 20个项目可能无关紧要,但很有必要了解其中的差异。 –

+0

公平点,没有考虑到这一点。 –

+0

这就是我所需要的。我在尝试第一个响应时没有注意到这一点。每次运行时,它都是我想要的,不重复。我不知道我在另一个人身上做了什么错,但我无法让它停止重复这一个。 – user2296611

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]; 
+0

我对阅读了,但我是相当新的C#还,我不知道如何拍摄出来放,并用它在下一步createboard (newicon [0],newicon [1],newicon [2],newicon [3],newicon [4],newicon [5],newicon [6],newicon [7],newicon [8] ,newicon [10],newicon [11],newicon [12],newicon [13],newicon [14],newicon [15],newicon [16],newicon [17],newicon [18] ); createboard基本上需要20个图像,并将它们放在他们的位置,我使用了一个有很多参数的函数?因为我必须为许多不同的结果创建板 – user2296611

+0

您要做的是洗刷列表,然后从列表中选取前20项。 –

+0

@ user2296611那么,我不知道你是什么意思的所有这些newicons,这是超出了这个问题的范围。如果您需要更多的帮助,并且根据指导方针是合适的,请发布一个新问题。 – Zong