【发布时间】:2019-01-12 02:34:38
【问题描述】:
我正在尝试使用下面的代码的 sn-p 生成一个唯一的随机数生成器,但它不起作用。 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
提前致谢。
【问题讨论】:
-
Dim dItemAmount as Integer = 1,dItemAmount = dItemAmount + 1在达到If dItemAmount = 1 Then之前会变成2,不是吗?那么你的ElseIf将永远不会触发,因为RollCheck可能是空的。设置断点,使用调试器。 -
在检查 Contains 后,您再次调用 r,Next 但您可以再次获得数组中已经存在的数字
-
ArraryLists 已经过时了一段时间(不是正式的,而是实践方面的)。请改用
List(Of Integer),甚至更好:HashSet(Of Integer),它更快且不允许重复。此外,如果您尝试添加的项目已经存在,HashSet.Add()method 将返回False。 -
这段代码有很多问题,老实说:1)
dItemAmount在你做任何事情之前就会变成 2。 2) 您的ElseIf仅在您生成的号码之前已生成并保存到列表中时才会触发。 3)正如@Steve 所说,您可以在列表中生成一个数字。 4) 你无法在第一次运行后生成一个数字,除非你点击列表中已经存在的一个(以便它进入你的ElseIf)然后生成一个新的。 -
更简单的选择是对数组进行洗牌,然后从其中一个一个地获取值stackoverflow.com/questions/254844/…
标签: vb.net