Function Draw(Arr, Amount As Long)
' hàm ch?n l?n lu?t Amount ph?n t? c?a m?ng Arr. Vi?c ch?n ph?n t? c?a m?ng Arr d?ng nghia'
'v?i vi?c ch?n ch? s? c?a ph?n'
' t? dó trong m?ng
' Ta dùng vòng l?p có Amount bu?c. Trong m?i bu?c ta ch?n 1 ch? s?, t?c 1 ph?n t?. Ta lo?i ph?n'
't? du?c ch?n
' kh?i l?n ch?n ti?p theo b?ng cách ghi ph?n t? th? k trong m?ng ngu?n vào v? trí có ch? s? v?a
'du?c ch?n và tang
' thêm 1 don v? c?n du?i c?a kho?ng ch? s? thao tác trong vòng l?p sau. B?ng cách này trong m?i
'vòng l?p ta ch?
' ch?n trong nh?ng ph?n t? chua du?c ch?n. Luôn có Amount vòng l?p. Dùng t? di?n có th? s?
'vòng l?p s? > Amount
Dim index As Long, k As Long, d As Long, c As Long, tmpArr, original
If Amount > UBound(Arr) - LBound(Arr) + 1 Then Exit Function
original = Arr
ReDim tmpArr(1 To Amount)
d = LBound(original)
c = UBound(original)
Randomize
For k = 1 To Amount
' ch?n ch? s? trong kho?ng ch? s? hi?n th?i
'index = Int(Rnd() * (c - d + 1)) + d
index = Int(Rnd() * (c - d - k + 2)) + d + k - 1
' ghi ph?n tu du?c ch?n vào m?ng k?t qu?
tmpArr(k) = original(index)
' lo?i phân t? v?a ch?n b?ng cách thay th? nó b?ng ph?n t? th? k trong m?ng ngu?n,'
' t?c ph?n t? có ch? s? k + LBound(Arr) - 1
original(index) = original(k + LBound(original) - 1)
' tang c?n du?i c?a kho?ng ch? s? thao tác'
d = d + 1
Next k
Draw = tmpArr
End Function
Sub Test1()
Dim sArr(), i&, iSo&
sArr = Array(1, 2, 3, 4, 5, 9)
iSo = 3
For i = 1 To iSo
Cells(i, 2) = Draw(sArr, iSo)(i)
Next i
End Sub