2016-12-02 75 views
-1

这是一个学校项目,任务是创建一个随机数发生器,产生6个结果(数字),这些数字必须存储到一个数组中,然后一次数字已经选择了一个按钮,然后使用冒泡排序按升序对它们进行排序。独特的随机数校验数组

我遇到的问题是,我得到了我的数组中的重复数字,但我已经设法完成了其余的要求。

Public Class Form1 
Dim pickedNumbers(5) As Integer 

Private Function getRandomNumber() 
    Randomize() 
    Dim randomNumber As Integer = CInt(Int((59 * Rnd()) + 1)) 
    If pickedNumbers.Contains(randomNumber) Then 
     getRandomNumber() 
    End If 
    Return randomNumber 
End Function 

Private Sub addNumbers() 
    For i = 0 To 5 
     pickedNumbers(i) = getRandomNumber() 
    Next 
    outputNumbers() 
End Sub 

Private Sub sortNumbers() 
    Dim Temp As Integer 
    For i = 5 To 1 Step -1 
     For k = 0 To i - 1 
      If pickedNumbers(k) > pickedNumbers(k + 1) Then 
       Temp = pickedNumbers(k) 
       pickedNumbers(k) = pickedNumbers(k + 1) 
       pickedNumbers(k + 1) = Temp 
      End If 
     Next 
    Next 
    outputNumbers() 
End Sub 

Private Sub outputNumbers() 
    tb1.Text = pickedNumbers(0) 
    tb2.Text = pickedNumbers(1) 
    tb3.Text = pickedNumbers(2) 
    tb4.Text = pickedNumbers(3) 
    tb5.Text = pickedNumbers(4) 
    tb6.Text = pickedNumbers(5) 
End Sub 

Private Sub btnPickNumbers_Click(sender As System.Object, e As System.EventArgs) Handles btnPickNumbers.Click 
    addNumbers() 
End Sub 

Private Sub btnSortOrder_Click(sender As Object, e As EventArgs) Handles btnSortOrder.Click 
    sortNumbers() 
End Sub 

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    For Each ctrl As Control In Me.Controls 
     If TypeOf ctrl Is TextBox Then 
      ctrl.Text = "" 
     End If 
    Next 
End Sub 

末级

我试图回忆起我的职责,是否存在以产生另一个数字。

+0

我试着在标签框中输入visual basic,VBA出现了,我的道歉。 – Sickaaron

+0

随机数字不一定是唯一的。如果第二个号码不允许与第一个号码相同,它不是随机的。 – Blackwood

+0

难道你不能只检查新生成的数字是否已经存在于数组中,并且如果是这样的话生成另一个?最好在'addNumbers()'的循环中执行此操作。但是它需要例如一个'While'循环(在你现有的循环中),这样你就可以继续生成新的数字,直到找到唯一的数字。 –

回答

0

您应该只在程序中调用一次Randomize()。

当您调用Randomize()时,您播种的是随机数字序列。这不是真的随机。这是一个伪随机确定性序列。对于任何给定的种子,序列总是相同的。

当没有参数调用Randomize()时,它使用Timer()函数为序列播种。 Timer()函数的分辨率只有一秒。如果每秒调用一次没有参数的Randomize(),则每次调用都会将序列重置为第一个伪随机数。

每次调用getRandomNumber()函数时,都会调用Randomize()函数,并且这种情况发生在一个紧密的循环中,无疑需要不到一秒的时间才能执行。

+0

感谢您的有用评论,也许如果我把Randomize()放在我的表单加载中,那么它只会调用一次? – Sickaaron

+0

是的,或者为您的Form1类定义一个构造函数。 –

0

根据@VisualVincent提供的建议,我找出了答案。

Private Function getRandomNumber() 
     Return CInt(Int((59 * Rnd()) + 1)) 
    End Function 

    Private Sub addNumbers() 
     Dim randomNumber As Integer 
     For i = 0 To 5 
      randomNumber = getRandomNumber() 
      While Not pickedNumbers.Contains(randomNumber) 
       pickedNumbers(i) = randomNumber 
      End While 
     Next 
     outputNumbers() 
    End Sub 

谢谢!