先看一个小程序
OptionExplicit
Dim a(1To 10) As Integer
Dim i AsInteger, j As Integer, temp As Integer
Dim flag
'随机产生10个1到100之间的数
PrivateSub Command1_Click()
'产生并显示第一个数
a(1) =Int(Rnd * 100)
Printa(1)
'标志为0时,说明不重复
flag = 0
'产生第2到第9个数
For i = 2To 10
temp = Int(Rnd * 100)
'判断新产生的数是否与前i-1个数重复
For j = 1 To i - 1
If a(j) = temp Then
'标志为1说明重复,退出循环
flag = 1
Exit For
Else
a(i) = temp
End If
Next j
Print a(i)
Next i
End Sub
产生多个不重复的随机数,首先需要有产生数的大致思路,然后进行判断得出不重复的多个数。这个程序关键之处是“不重复”,判断所产生的数是否重复是很严密的逻辑问题,任何一个语句写错位置都不能得出正确的结果。先写出大致过程,然后慢慢调试,比如你会遇到这样的问题,exit for位置不对,如果写在next j 后面将会使判断过程不起作用;如果print a(i)写在第二层循环里面,那么将会打印多个该数。
把这个程序稍微变换一下
如题:
产生k个m到n之间不重复的随机数
OptionExplicit
Dim a()As Integer
Dim i AsInteger, j As Integer
Dim m AsInteger, n As Integer, k As Integer, temp As Integer
Dim flag
PrivateSub Command1_Click()
k = InputBox("请输入k的值")
m = InputBox("请输入m的值")
n = InputBox("请输入n的值")
ReDim a(k) As Integer
a(1) = m + Int((n - m) * Rnd)
Print a(1)
flag = 0
For i = 2 To k
temp = m + Int((n - m) * Rnd)
For j = 1 To i - 1
If a(j) = temp Then
flag = 1
Exit For
Else
a(i) = temp
End If
Next j
Print a(i)
Next i
End Sub
其实只是形式变了一下,核心还是不变的,只是最初我也没有反应过来,原来计算机如此智能。需要注意的一点是这里涉及到可变数组的知识,我把ReDim a(k) As Integer写在了第一句,也就是产生k之前,结果下标越界。。。还是好好复习一下吧。