我有一个程序,我已经建立了个人使用,它将从列表框中的一组选中的项目中随机选择一部电影。我编入这个应用程序的功能之一是能够生成“分层结果”。我的意思是一个分层的结果是,一个算法应该首先随机选择三部电影,然后随机选择其中两部,然后从这两部电影中最终随机选择一部电影。随机从列表中选择一个子集
为了说明我的意思:
影片列表:尖叫,尖叫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
但是我遇到的问题是电影可以在任何给定的层次中随机生成两次。下面的图片应该可以帮助说明我的意思:
请注意,在第2级,“星球大战传奇”产生的两倍。这最终导致“星球大战传奇”成为第3层的保证结果。
我想知道是否有简单的方法(随意改进我的代码,我意识到它可能效率低下,我只是把东西扔在一起快速)来解决这个问题。我希望每个层次的结果对该层次都是唯一的。
这在一定程度上有效,如果只选择了一部电影,则会引发错误。 –
@JasonBristol这只是一个经典算法,用于从n个元素列表中选择m个随机元素,其中m <= n。您首先应该检查您是否要选择较少的元素,即列表中可用元素的数量。 – jbaylina
@JasonBristol我纠正了最后一个伪代码行。 (我用-1改变了我)。 – jbaylina