2013-05-30 87 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