vb.net - 从列表中随机选择一个子集

标签 vb.net algorithm subset random

我有一个为个人使用而构建的程序,它会从列表框中的一组选中项目中随机选择一部电影。我编写到此应用程序中的功能之一是能够生成“分层结果”。我所说的分层结果是指算法应首先随机选择三部电影,然后随机选择其中两部电影,最后从这两部电影中随机选择一部电影。

为了帮助说明我的意思:

电影列表:尖叫声、尖叫声 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 层中,“Star Wars Saga”是如何生成两次的。这最终导致“星球大战传奇”成为第 3 层的确保结果。

我想知道是否有一种简单的方法(随意改进我的代码,我意识到它可能效率低下,我只是快速地拼凑了一些东西)来解决这个问题。我希望每一层的结果对于该层都是唯一的。

最佳答案

假设您有一个包含 N 部电影(或电影索引)的向量 V。

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,并且不包括提取的元素。这个新列表有不同的顺序,但因为我们选择了一个随机的,所以我们不关心它。

关于vb.net - 从列表中随机选择一个子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18523326/

相关文章:

xml - 如何将 ns1.MyPersonalClass 转换为 ns2.MyPersonalClass ?他们拥有相同的属性(property)或成员

VB.Net 属性 - 公共(public)获取、私有(private)设置

python - 如何创建 "at least n"约束?

java - 在 Java 中创建 Set 的子集

r - 根据另一个数据框中的多个条件过滤数据框

vb.net - 子字符串期间参数超出范围异常

javascript - 合并来自用户控件的 pageLoad() 代码?

algorithm - 使用哪种移位覆盖算法

algorithm - 如果巨大的数组比查找 HashMap 更快?

r - 如何使用 R 中的纬度/经度边界从 netCDF 文件中获取子集