2013-08-30 43 views
0

我有一個程序,我已經建立了個人使用,它將從列表框中的一組選中的項目中隨機選擇一部電影。我編入這個應用程序的功能之一是能夠生成「分層結果」。我的意思是一個分層的結果是,一個算法應該首先隨機選擇三部電影,然後隨機選擇其中兩部,然後從這兩部電影中最終隨機選擇一部電影。隨機從列表中選擇一個子集

爲了說明我的意思:

影片列表:尖叫,尖叫2,尖叫3,怪物公司,小鹿斑比,小鹿斑比2

1級:尖嘯3,小鹿斑比,小鹿斑比2

第2層:尖嘯3,班貝

第3層:班比

我已成功用下面的代碼來實現這一點:

Private Sub btnPick_Click(sender As System.Object, e As System.EventArgs) Handles btnPick.Click 
    If boxMovies.CheckedItems.Count <> 0 Then 
     Dim rnd As New Random 

     If My.Settings.Tier = True Then 
      lbl1.Text = boxMovies.CheckedItems.Item(rnd.Next(boxMovies.CheckedItems.Count)) 
      Randomize() 
      lbl2.Text = boxMovies.CheckedItems.Item(rnd.Next(boxMovies.CheckedItems.Count)) 
      Randomize() 
      lbl3.Text = boxMovies.CheckedItems.Item(rnd.Next(boxMovies.CheckedItems.Count)) 

      Randomize() 
      Dim stp2() As String = {lbl1.Text, lbl2.Text, lbl3.Text} 
      lbl4.Text = stp2(rnd.Next(stp2.Length)) 
      Randomize() 
      lbl5.Text = stp2(rnd.Next(stp2.Length)) 

      Randomize() 
      Dim stp3() As String = {lbl4.Text, lbl5.Text} 
      lbl6.Text = stp3(rnd.Next(stp3.Length)) 
     Else 
      MessageBox.Show(boxMovies.CheckedItems.Item(rnd.Next(boxMovies.CheckedItems.Count)), "Movie Result", MessageBoxButtons.OK) 
     End If 
    Else 
     MessageBox.Show("Please pick at least one movie!", "No Movies Selected", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) 
    End If 

End Sub 

但是我遇到的問題是電影可以在任何給定的層次中隨機生成兩次。下面的圖片應該可以幫助說明我的意思:

enter image description here

請注意,在第2級,「星球大戰傳奇」產生的兩倍。這最終導致「星球大戰傳奇」成爲第3層的保證結果。

我想知道是否有簡單的方法(隨意改進我的代碼,我意識到它可能效率低下,我只是把東西扔在一起快速)來解決這個問題。我希望每個層次的結果對該層次都是唯一的。

回答

1

想象一下,你有一個向量V與N電影(或索引到電影)。

For i:=0 to 2 do 
    r := rand(N-i-1)   // A random integer fro 0..N-i-1 inclusive 
    AddToResult(V[r]) 
    V[r] := V[N-i-1]   // Override the selected element with the last one. 

這個想法是從列表中選擇一個隨機元素,並將最後一個元素放在提取元素的位置。所以新的列表將具有N-1的長度並且將不包括提取的元素。這個新的列表有不同的順序,但是因爲我們選擇了一個隨機的列表,所以我們不關心它。

+0

這在一定程度上有效,如果只選擇了一部電影,則會引發錯誤。 –

+0

@JasonBristol這只是一個經典算法,用於從n個元素列表中選擇m個隨機元素,其中m <= n。您首先應該檢查您是否要選擇較少的元素,即列表中可用元素的數量。 – jbaylina

+0

@JasonBristol我糾正了最後一個僞代碼行。 (我用-1改變了我)。 – jbaylina