vanphu_ht91
Thành viên mới

- Tham gia
- 6/4/17
- Bài viết
- 21
- Được thích
- 0
Làm cái hàm random từ 1 đến 9 và mảng 1 đến,9 để,kiểm soát trùng lặp là ok.Xin chào mọi người.
Mình có một bài tập tìm ra người may mắn ngẫu nhiên như sau.
Nhờ mọi người giúp viết code VBA chọn ngẫu nhiên người may mắn trúng giải nhất, giải nhì, giải ba,...
Điều kiện: Người trúng giải phải là duy nhất (1 người không thể trúng 2 giải)
Xin cảm ơn!
View attachment 281556
Mình cũng nghĩ là dùng random between từ 1 đến 9.Làm cái hàm random từ 1 đến 9 và mảng 1 đến,9 để,kiểm soát trùng lặp là ok.
Thì bạn thử lặp từ 0 cho đến 10 mũ 9Mình cũng nghĩ là dùng random between từ 1 đến 9.
Nhưng làm thế nào để không bị lặp lại nhỉ.
Cũng là cách nhưng có vẻ hơi cồng kềnh bác ạ. Vừa phải F9, vừa phải chạy code, vừa phải công thức nữaViết 1 đoạn code thực hiện random cho đến khi h4,h5,h6 không trùng
Mã:Sub TinhToanLai() Do Until [H4] <> [H5] And [H4] <> [H6] And [H6] <> [H5] ThisWorkbook.Worksheets("Sheet1").Columns(8).Calculate Loop End Sub
Về ý tưởng thì mình có, căn bản tại mình mới học nên chưa làm tốt việc biến ý tưởng thành code ấy.Bài tập chảnh. Tiếng Tây tiếng U tùm lum.
Loại bài này thì giải thuật là nguyên tắc sắp xếp ngẫu nhiên. Có hai cách:
1. Giải thuật bốc lô tô. Bốc ngẫu nhiên và hoán vị từ vị trí 1 đến n.
2. Giải thuật gán số ngẫu nhiên và sắp xếp theo số này.
Cả hai kiểu này ở đây có cả đống.
Ý tưởng với ý ẹ. Làm tốt với làm xấu.Về ý tưởng thì mình có, căn bản tại mình mới học nên chưa làm tốt việc biến ý tưởng thành code ấy.
Cái thứ 2 bạn khai báo 1 mảng ví dụ dieukien(1 to 9) as Boolean.Khi nào tìm được vị trí nào từ 1 đến 9 thì dieukien(so)=true xét điều kiện để vào được đây là dieukien(so)=False.Nếu không bạn dùng Dictionary cũng được.Nếu ít nữa thì dùng hàm instr cũng lọc trùng được.Mình cũng nghĩ là dùng random between từ 1 đến 9.
Nhưng làm thế nào để không bị lặp lại nhỉ.
Thử code này.Xin chào mọi người.
Mình có một bài tập tìm ra người may mắn ngẫu nhiên như sau.
Nhờ mọi người giúp viết code VBA chọn ngẫu nhiên người may mắn trúng giải nhất, giải nhì, giải ba,...
Điều kiện: Người trúng giải phải là duy nhất (1 người không thể trúng 2 giải)
Xin cảm ơn!
View attachment 281556
Sub abc()
Dim i As Long, arr, kq, a As Integer, b As Integer, c As Integer
With Sheets("sheet1")
arr = .Range("B3:E11").Value
b = UBound(arr)
ReDim kq(1 To 3, 1 To 4)
Do
a = Fix(Rnd() * b) + 1
If Not arr(a, 1) = "Da co" Then
c = c + 1
kq(c, 1) = c
kq(c, 2) = arr(a, 2)
kq(c, 3) = arr(a, 3)
kq(c, 4) = arr(a, 4)
arr(a, 1) = "Da co"
If c = 3 Then Exit Do
End If
Loop
.Range("h4:k6").Value = kq
End With
End Sub
Bốc ngẫu nhiên N từ K:Cái thứ 2 bạn khai báo 1 mảng ví dụ dieukien(1 to 9) as Boolean.Khi nào tìm được vị trí nào từ 1 đến 9 thì dieukien(so)=true xét điều kiện để vào được đây là dieukien(so)=False.Nếu không bạn dùng Dictionary cũng được.Nếu ít nữa thì dùng hàm instr cũng lọc trùng được.
Sub NhatNhiBa()
Dim Rws As Long, DD As Byte, J As Long, SoNgau As Integer, VTr As Integer, Dem As Byte
Dim StrC As String
Rws = [C654321].End(xlUp).Row: DD = Len([C3].Value)
Randomize: [I4:I6].ClearContents
For J = 3 To Rws
SoNgau = 1 + 9999 * Rnd() \ 1
If SoNgau Mod 2 = 0 Then
StrC = StrC & "@" & CStr(Cells(J, "C").Value)
Else
StrC = CStr(Cells(J, "C").Value) & "@" & StrC
End If
Next J
For J = 1 To 99
SoNgau = 1 + DD * Rnd() \ 1
VTr = InStr(SoNgau * (DD + 1), StrC, "@")
If SoNgau Mod 6 = 0 And VTr > 0 Then
[I4].Offset(Dem).Value = Mid(StrC, 1 + VTr, DD)
Dem = Dem + 1
StrC = Mid(StrC, VTr + DD + 1, Len(StrC)) & Left(StrC, VTr - 1)
ElseIf VTr > 0 Then
StrC = Mid(StrC, VTr, Len(StrC)) & Left(StrC, VTr - 1)
End If
If Dem = 3 Then Exit For
Next J
MsgBox J
End Sub
Bạn này chắc chắn là siêu lắm đây.Bốc ngẫu nhiên N từ K:
Giải thuật lọc trùng không đúng lắm.
Thứ nhất, theo lý thuyết, khi N tiến gần K thì khả năng "đụng hàng" tăng. Có thể xảy tình trạng chạy quanh quẩn. Tuy trên nthực tế hiếm khi xảy ra.
Thứ hai, nguyên tắc của "bốc lô tô" là số nào bốc rồi là bỏ ra ngoài, lượt kế tiếp bốc số còn lại trong túi. Giải thuật lọc trùng là bỏ số trở lại túi, lỡ bốc nhằm lần thứ nhì thì lại bỏ vào bốc tiếp.
View attachment 281585
View attachment 281586
"siêu" thì còn tùy nhận định người khác.Bạn này chắc chắn là siêu lắm đây.
Tư duy khác quá, mình mới học nên còn gà lắm.
Với lại chắc cũng học để phục vụ công việc thôi chứ không chuyên sâu được như bạn.