|
楼主 |
发表于 2013-12-2 22:17
|
显示全部楼层
六、几个实例:
生成1至10000之间不重复的随机数序列:
Sub 不重复随机数1()
tim = Timer
Dim c As New Collection, ar(1 To 10001, 1 To 1)
c.Add 0
For i% = 1 To 10000
c.Add i, before:=Int(i * Rnd + 1) '此处利用序号
Next
i = 0
For Each t In c '此处开始把生成的序列写进数组
i = i + 1
ar(i, 1) = t
Next
MsgBox Timer - tim
[a1].Resize(i - 1) = ar
End Sub
Sub 不重复随机数2()
tim = Timer
Dim c As New Collection, ar(1 To 10001, 1 To 1)
c.Add 0, "a0"
For i% = 1 To 10000
c.Add i, "a" & i, before:=("a" & Int(i * Rnd)) '此处利用key,要比上一个快些
Next
i = 0
For Each t In c '同上一段,写进数组
i = i + 1
ar(i, 1) = t
Next
MsgBox Timer - tim
[b1].Resize(i - 1) = ar
End Sub
Sub 不重复随机数m_n_j001() '源于eh中的另一思路
tim = Timer
Dim s As New Collection, ar(1 To 10000, 1 To 1)
For i% = 1 To 10000
s.Add i
Next
Randomize
For i = 1 To 10000
r% = Int(Rnd * s.Count + 1)
ar(i, 1) = s(r)
s.Remove (r)
Next
MsgBox Timer - tim
[c1].Resize(i - 1) = ar
End Sub
排序:把前面生成的A列中数据排序。没有其他思路,就全抄写eh中的了
Sub 排序_by_m_n_j001()
Dim c As New Collection, ar()
ar = [a1:a10000].Value
tim = Timer
For i% = 1 To 10000
For Each t In c
If t >= ar(i, 1) Then Exit For
Next
If t = Empty Then
c.Add ar(i, 1), "|" & ar(i, 1)
Else
If t <> ar(i, 1) Then
c.Add ar(i, 1), "|" & ar(i, 1), before:="|" & t
Else
i2 = i2% + 1
c.Add ar(i, 1), "|" & i2 & ar(i, 1), AFTER:="|" & ar(i, 1)
End If
End If
Next
i = 0
For Each t In c
i = i + 1
ar(i, 1) = t
Next
Msgbox Timer - tim
[e1:e10000] = ar
End Sub
Sub 排序_by_northwolves() ‘原代码不是这样,略改了点。思想是原作者的。
Dim c As New Collection, ar()
ar = [a1:a10000].Value
tim = Timer
c.Add ar(1, 1)
For i% = 2 To 10000
last% = c.Count
If ar(i, 1) <= c(1) Then c.Add ar(i, 1), before:=1: GoTo nextnum
If ar(i, 1) >= c(last) Then c.Add ar(i, 1): GoTo nextnum
first = 1
Do While last > first + 1 '二分法查找。
temp = (last + first) / 2
If ar(i, 1) > c(temp) Then
first = temp
Else
last = temp
End If
Loop
c.Add ar(i, 1), before:=last
nextnum:
Next
For i = 1 To 10000
ar(i, 1) = c(i)
Next
msgbox Timer - tim
[f1:f10000] = ar
End Sub
|
|