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
我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)
构建一个比较器:
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