有没有一种简单的方法可以随机化VB.NET中的列表?

And*_*ers 6 vb.net random list visual-studio-2008

我有一个类型列表System.IO.FileInfo,我想随机列表.我以为我记得看到过list.randomize()一会儿的东西,但我找不到我可能已经看到的地方.

我第一次尝试这个功能让我有了这个功能:

Private Shared Sub GetRandom(ByVal oMax As Integer, ByRef currentVals As List(Of Integer))
    Dim oRand As New Random(Now.Millisecond)
    Dim oTemp As Integer = -1
    Do Until currentVals.Count = IMG_COUNT
        oTemp = oRand.Next(1, oMax)
        If Not currentVals.Contains(oTemp) Then currentVals.Add(oTemp)
    Loop
End Sub
Run Code Online (Sandbox Code Playgroud)

我发送它想要它迭代到的最大值,并且我想要随机化内容的列表的引用.该变量IMG_COUNT在脚本中设置得更远,指定我想要显示多少随机图像.

谢谢你们,我很感激:D

nic*_*ick 14

查看Fisher-Yates shuffle算法:http://en.wikipedia.org/wiki/Knuth_shuffle

这个网站的主要负责人在这里进行了更为简洁的讨论:http: //www.codinghorror.com/blog/archives/001015.html

博客条目中有一个简单的C#实现,应该很容易更改为VB.NET


Pau*_*sma 5

List使用以下Randomize()函数扩展了类以使用Fisher-Yates shuffle算法:

''' <summary>
''' Randomizes the contents of the list using Fisher–Yates shuffle (a.k.a. Knuth shuffle).
''' </summary>
''' <typeparam name="T"></typeparam>
''' <param name="list"></param>
''' <returns>Randomized result</returns>
''' <remarks></remarks>
<Extension()>
Function Randomize(Of T)(ByVal list As List(Of T)) As List(Of T)
    Dim rand As New Random()
    Dim temp As T
    Dim indexRand As Integer
    Dim indexLast As Integer = list.Count - 1
    For index As Integer = 0 To indexLast
        indexRand = rand.Next(index, indexLast)
        temp = list(indexRand)
        list(indexRand) = list(index)
        list(index) = temp
    Next index
    Return list
End Function
Run Code Online (Sandbox Code Playgroud)


Joe*_*orn 3

构建一个比较器:

Public Class Randomizer(Of T)
    Implements IComparer(Of T)

    ''// Ensures different instances are sorted in different orders
    Private Shared Salter As New Random() ''// only as random as your seed
    Private Salt As Integer
    Public Sub New()
        Salt = Salter.Next(Integer.MinValue, Integer.MaxValue)
    End Sub

    Private Shared sha As New SHA1CryptoServiceProvider()
    Private Function HashNSalt(ByVal x As Integer) As Integer
      Dim b() As Byte = sha.ComputeHash(BitConverter.GetBytes(x))
      Dim r As Integer = 0
      For i As Integer = 0 To b.Length - 1 Step 4
          r = r Xor BitConverter.ToInt32(b, i)
      Next

      Return r Xor Salt
    End Function

    Public Function Compare(x As T, y As T) As Integer _
        Implements IComparer(Of T).Compare

        Return HashNSalt(x.GetHashCode()).CompareTo(HashNSalt(y.GetHashCode()))
    End Function
End Class
Run Code Online (Sandbox Code Playgroud)

像这样使用它,假设您指的是通用的List(Of FileInfo)

list.Sort(New Randomizer(Of IO.FileInfo)())
Run Code Online (Sandbox Code Playgroud)

您还可以使用闭包来使随机值“粘性”,然后仅使用 linq 的 .OrderBy() (这次是 C#,因为 VB lambda 语法很难看):

list = list.OrderBy(a => Guid.NewGuid()).ToList();
Run Code Online (Sandbox Code Playgroud)

此处解释,以及为什么它可能不如真正的随机播放那么快:
http://www.codinghorror.com/blog/archives/001008.html ?r=31644