簡體   English   中英

VB.NET 中的隨機隨機文本框行

[英]Random Shuffle Textbox Lines in VB.NET

如何隨機化(洗牌)文本框行? 文本框中的這些行,我必須再次隨機排列它們。 數字將保持不變,行將更改。

1,2
3,5
7,9
12,15
21,24
31,36
41,49
51,54

輸出:經過shuffle()隨機

3,5
1,2
7,9
12,15
31,36
21,24
51,54
41,49

代碼:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    TextBox1.Text(RandomizeList)
End Sub

' Randomize the list.
Public Sub RandomizeList(items() As Integer)
    Dim min_item As Integer
    Dim max_item As Integer
    Dim i As Integer
    Dim j As Integer
    Dim tmp_value As Integer

    min_item = LBound(items)
    max_item = UBound(items)

    For i = min_item To max_item - 1
        ' Randomly assign item number i.
        j = Int((max_item - i + 1) * Rnd() + i)
        tmp_value = items(i)
        items(i) = items(j)
        items(j) = tmp_value
    Next i
End Sub

預期輸出:

打亂文本框的行。

打亂列表的最簡單方法是:

Dim list = New List(Of String) From {"1,2", "3,5", "7,9", "12,15", "21,24", "31,36", "41,49", "51,54"}
Dim rnd As New Random()
Dim shuffled = list.OrderBy(Function (x) rnd.Next()).ToList()

這應該這樣做:

<TestMethod>
Public Sub RandomizeList()
  Dim oControl As List(Of Integer)
  Dim oOldList As List(Of String)
  Dim oNewList As List(Of String)
  Dim iRandom As Integer
  Dim oRandom As Random

  oControl = New List(Of Integer)
  oOldList = New List(Of String) From {"1,2", "3,5", "7,9", "12,15", "21,24", "31,36", "41,49", "51,54"}
  oNewList = New List(Of String)
  oRandom = New Random

  oOldList.ForEach(Sub(Item)
                     Do
                       iRandom = oRandom.Next(oOldList.Count)
                     Loop While oControl.Contains(iRandom)

                     oControl.Add(iRandom)
                     oNewList.Add(oOldList(iRandom))
                   End Sub)

  Debug.WriteLine("")
  Debug.WriteLine("Old List")
  Debug.WriteLine("----------")
  oOldList.ForEach(Sub(Item) Debug.WriteLine(Item))

  Debug.WriteLine("")
  Debug.WriteLine("New List")
  Debug.WriteLine("----------")
  oNewList.ForEach(Sub(Item) Debug.WriteLine(Item))
End Sub

- 更新 -

這是完成任務的另一種方法,更簡潔:

  <Extension>
  Public Function Randomize(Of T)(Instance As IEnumerable(Of T)) As IEnumerable(Of T)
    Return Instance.Randomize(New Random())
  End Function

  <Extension>
  Public Iterator Function Randomize(Of T)(Instance As IEnumerable(Of T), Rng As Random) As IEnumerable(Of T)
    Dim oBuffer As List(Of T)
    Dim iRandom As Integer
    Dim iIndex As Integer

    Instance.ThrowIfNothing(NameOf(Instance))
    Rng.ThrowIfNothing(NameOf(Rng))

    oBuffer = Instance.ToList

    For iIndex = 0 To oBuffer.Count - 1
      iRandom = Rng.Next(iIndex, oBuffer.Count)
      Yield oBuffer(iRandom)
      oBuffer(iRandom) = oBuffer(iIndex)
    Next
  End Function

它們現在是一組重載的Extension方法,適合包含在通用工具庫中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM