VB.NET随机唯一生成器

时间:2018-08-04 12:21:07

标签: vb.net

我试图用下面的代码片段生成一个唯一的随机数生成器,但是它不起作用。 IF部分假设测试它是否是生成的第一个随机数,如果是,则将第一个随机数添加到ArrayList中,如果它不是第一个随机数,则应检查该随机数是否已存在ArrayList,如果它在ArrayList中,则假定它到MsgBox并生成一个新的唯一随机数,该随机数尚未存在于ArrayList中,并将其添加到ArrayList中,但它没有任何作用。任何帮助将不胜感激。

Public Class Form1
    Dim r As New Random
    Dim dLowestVal As Integer = 1
    Dim dHighestVal As Integer = 26
    Dim dItemAmount As Integer = 1
    Dim RollCheck As New HashSet(Of Integer)

    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
        End
    End Sub

    Private Sub btnRollDice_Click(sender As Object, e As EventArgs) Handles btnRollDice.Click
        lblRandomNo.Text = r.Next(dLowestVal, dHighestVal)

        lblItemAmount.Text = dItemAmount

        If dItemAmount = 1 Then
            RollCheck.Add(Val(lblRandomNo.Text))
        ElseIf (RollCheck.Contains(Val(lblRandomNo.Text))) Then
            MsgBox("Already Exists")
            lblRandomNo.Text = r.Next(dLowestVal, dHighestVal)
            RollCheck.Add(Val(lblRandomNo.Text))
        End If

        dItemAmount = dItemAmount + 1

谢谢。

2 个答案:

答案 0 :(得分:6)

您可以用这种简单的方法替换整个方法

' This is globally declared at the top of your form
Dim values As New List(Of Integer)

' This is called when you construct your form
' It will store consecutive integers from 1 to 25 (25 elements)
values = Enumerable.Range(1, 25).ToList()

这是一种从尚未使用的中提取整数的方法

Private Sub Roll()
    ' Get an index in the values list
    Dim v = r.Next(0, values.Count)

    ' insert the value at that index to your RollCheck HashSet
    RollCheck.Add(values(v))

    ' Remove the found value from the values list, so the next call 
    ' cannot retrieve it again. 
    values.Remove(values(v))
End Sub

您可以以这种方式从先前的事件处理程序中调用它

Private Sub btnRollDice_Click(sender As Object, e As EventArgs) Handles btnRollDice.Click
  if values.Count = 0 Then
      MessageBox("No more roll available")
  else
      Roll()
  End Sub
End Sub

答案 1 :(得分:2)

HashSet的要点在于,由于不允许重复,因此您只需检查Add()的返回值即可确定该号码是否已成功插入或列表中是否已存在

如果要继续尝试直到成功,您只需要将其包装在循环中即可:

If dHighestVal - dLowestVal >= RollCheck.Count Then
    'If the above check passes all unique values are MOST LIKELY already in the list. Exit to avoid infinite loop.
    MessageBox.Show("List is full!")
    Return 'Do not continue.
End If

Dim Num As Integer = r.Next(dLowestVal, dHighestVal)

'Iterate until a unique number was generated.
While Not RollCheck.Add(Num)
    MessageBox.Show("Already exists!")
    Num = r.Next(dLowestVal, dHighestVal)
End While

lblRandomNo.Text = Num

编写循环的另一种方法是:While RollCheck.Add(Num) = False