下面是我出错的程序 我想只要后一个数比前个大就可以了 不知是哪里错了Randomize Dim ran(10) As Integer, i, j, tNum As Integer, isExist As Boolean For i = 1 To 10 isExist = False tNum = Int(Rnd() * 100 + 301) For j = 1 To i If ran(j) <= ran(j + 1) Then isExist = True i = i - 1 Exit For ElseIf i < 10 And ran(j) = 400 Then isExist = True i = i - 1 Exit For End If Next If isExist = False Then ran(i) = tNum End If NextFor i = 1 To 10 Print ran(i) Next
你这样的话,并不好,根本不知道要从来多少遍再给一法,从n个数中随机取m个不一样的数 随机取一数,然后剩下n-1个数,取m-1个不一样的数 再取一数,剩下n-2个,取m-2个不一样的数, ... 再取一数,剩下n-k个,取m-k个不一样的数, ... 再取一数,剩下n-m+1个,取1个不一样的数, 于是完成,明否?下面是实现这一算法的函数Public Sub RandomMine(nAll&, nSel&, nSelArr() As Boolean) Dim i&, j& Dim tval&, added&, nSel2&, invert As Boolean Randomize TimernSel2 = nAll - nSel If nSel <= nSel2 Then invert = False nSel2 = nSel Else invert = True End IfFor i = 0 To nAll - 1 nSelArr(i) = False Next iFor i = 0 To nSel2 - 1 tval = Int(Rnd * (nAll - i)) added = 0 If tval < (nAll - i) / 2 Then For j = 0 To nAll - 1 If nSelArr(j) Then added = added + 1 End If If j - added = tval Then nSelArr(j) = True Exit For End If Next j Else For j = nAll - 1 To 0 Step -1 If nSelArr(j) Then added = added + 1 End If If nAll - 1 - j - added = nAll - i - tval Then nSelArr(j) = True Exit For End If Next j End If Next iIf invert Then For i = 0 To nAll - 1 nSelArr(i) = Not nSelArr(i) Next i End IfEnd Sub 用法, Dim tSelArr(0 To n) as boolean Call RandomMine(n, m, tSelArr)函数结束后,tSelArr中被设为True的元素就是被选到的数了
2.将产生的随机数排序
Dim ran(10) As Integer, i, j, tNum As Integer, isExist As Boolean
For i = 1 To 10
isExist = False
tNum = Int(Rnd() * 100 + 301)
For j = 1 To i
If ran(j) <= ran(j + 1) Then
isExist = True
i = i - 1
Exit For
ElseIf i < 10 And ran(j) = 400 Then
isExist = True
i = i - 1
Exit For
End If
Next
If isExist = False Then
ran(i) = tNum
End If
NextFor i = 1 To 10
Print ran(i)
Next
randomize timer"后一个数比前个大"显然是行不通的,
Int(Rnd() * 100 + 301)的范围是 301-400,如果第一个数就是400,那么后面的还怎么选,
所以不能用"后一个数比前个大"
随机取一数,然后剩下n-1个数,取m-1个不一样的数
再取一数,剩下n-2个,取m-2个不一样的数,
...
再取一数,剩下n-k个,取m-k个不一样的数,
...
再取一数,剩下n-m+1个,取1个不一样的数,
于是完成,明否?下面是实现这一算法的函数Public Sub RandomMine(nAll&, nSel&, nSelArr() As Boolean)
Dim i&, j&
Dim tval&, added&, nSel2&, invert As Boolean
Randomize TimernSel2 = nAll - nSel
If nSel <= nSel2 Then
invert = False
nSel2 = nSel
Else
invert = True
End IfFor i = 0 To nAll - 1
nSelArr(i) = False
Next iFor i = 0 To nSel2 - 1
tval = Int(Rnd * (nAll - i))
added = 0
If tval < (nAll - i) / 2 Then
For j = 0 To nAll - 1
If nSelArr(j) Then
added = added + 1
End If
If j - added = tval Then
nSelArr(j) = True
Exit For
End If
Next j
Else
For j = nAll - 1 To 0 Step -1
If nSelArr(j) Then
added = added + 1
End If
If nAll - 1 - j - added = nAll - i - tval Then
nSelArr(j) = True
Exit For
End If
Next j
End If
Next iIf invert Then
For i = 0 To nAll - 1
nSelArr(i) = Not nSelArr(i)
Next i
End IfEnd Sub
用法,
Dim tSelArr(0 To n) as boolean
Call RandomMine(n, m, tSelArr)函数结束后,tSelArr中被设为True的元素就是被选到的数了