2013-08-30 44 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