我试图用下面的代码片段生成一个唯一的随机数生成器,但是它不起作用。 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
谢谢。
答案 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
。