@Steven 得到了一个有效的观点。但我认为您甚至可以不添加SortIndex
,因为您可以直接在查询中随机播放结果,如下所示(假设您的后端是 MSSQL):
SELECT * FROM table1 ORDER BY NEWID()
如果仍然需要,可以通过以下方式以编程方式对数组进行混洗:
Dim a() As String = {"Sarah", "James", "Alex", "Daniel"}
Dim shuffledList As New List(Of String)
Randomize()
For i = 0 To UBound(a)
Dim allowedValues() As String = a.Except(shuffledList).ToArray
shuffledList.Add(allowedValues(Math.Floor(Rnd() * allowedValues.Count)))
Next
如果要确保任何元素不重复原始顺序,请改用以下代码:
Dim a() As String = {"Sarah", "James", "Alex", "Daniel"}
Dim ub As Integer = UBound(a)
Dim shuffledList As New List(Of String)
Randomize()
For i = 0 To ub
Dim allowedValues() As String = a.Except(shuffledList).Except({a(i)}).ToArray
Dim randomValue As String
If i = ub - 1 And allowedValues.Contains(a(ub)) Then
randomValue = a(ub)
Else
randomValue = allowedValues(Math.Floor(Rnd() * allowedValues.Count))
End If
shuffledList.Add(randomValue)
Next
这里最重要的部分是如果最后一个项目尚未被拾取,则最后一个项目之前的项目被强制成为最后一个项目。这是为了确保最后一个项目除了最后一个位置之外的某个地方,否则在最后一步中没有任何东西可以选择。总体而言,序列似乎是随机排序的,并且可以保证项目#1 不会是#1,#2 不会是#2 等等。算法总是以 N 步结束,其中 N 是项目数。