-
số ngẫu nhiên duy nhất, không trùng lặp
btamsgn > 19-02-24, 09:37 PM
Chào các bạn,
Nhờ các ban chỉ giúp mình mã để tạo tạo số ngẫu nhiên từ 1 to 15, không trùng lặp và duy nhất
Mình dùng code dưới nhưng bị trùng lặp
randnum = Int((15 - 1 + 1) * Rnd + 1)
Thanks, -
RE: số ngẫu nhiên duy nhất, không trùng lặp
bvchauthanh > 19-02-24, 10:38 PM
bạn thử với đoạn mã sau và điều chỉnh lại cho phù hợp nhé
Mã PHP:Dim Numbers(14) As Integer
Dim i As Integer
Dim temp As Integer
Dim j As Integer
For i = 0 To 14
Numbers(i) = i + 1
Next i
For i = 14 To 0 Step -1
j = Int((i + 1) * Rnd)
temp = Numbers(i)
Numbers(i) = Numbers(j)
Numbers(j) = temp
Next i
For i = 0 To 14
Debug.Print Numbers(i)
Next i -
RE: số ngẫu nhiên duy nhất, không trùng lặp
btamsgn > 20-02-24, 05:26 AM
mã của bạn sau khi kiểm tra vẫn bị lặp lại
(19-02-24, 10:38 PM)bvchauthanh Đã viết: bạn thử với đoạn mã sau và điều chỉnh lại cho phù hợp nhé
Mã PHP:Dim Numbers(14) As Integer
Dim i As Integer
Dim temp As Integer
Dim j As Integer
For i = 0 To 14
Numbers(i) = i + 1
Next i
For i = 14 To 0 Step -1
j = Int((i + 1) * Rnd)
temp = Numbers(i)
Numbers(i) = Numbers(j)
Numbers(j) = temp
Next i
For i = 0 To 14
Debug.Print Numbers(i)
Next i -
RE: số ngẫu nhiên duy nhất, không trùng lặp
ongke0711 > 20-02-24, 08:04 AM
Trên diễn đàn có sẳn mấy bài quay số may mắn, không lặp lại các số đã trúng rồi đó, bạn tìm kiếm và tham khảo đi. -
RE: số ngẫu nhiên duy nhất, không trùng lặp
btamsgn > 20-02-24, 10:38 AM
Mình tìm thấy code bên dưới của bạn "man dinh gai" nhung vẫn chưa hiểu về code cmdquaythuong
Public Function Songaunhien(Tentuythich As Variant)
Randomize
Songaunhien = Rnd(1)
End Function
Private Sub cmdQuaythuong_Click()
Dim s, i As Integer
s = 0
i = 1
Do Until i > (Right(Songaunhien("maidinhdan"), 2) * 60) + ((Me.txtSonguoithamdu.Value) * 3) + (Second(Now()) * 40)
With Recordset
.MoveNext
If .EOF Then .MoveFirst
End With
s = s + i
i = i + 1
Loop
End Sub
(20-02-24, 08:04 AM)ongke0711 Đã viết: Trên diễn đàn có sẳn mấy bài quay số may mắn, không lặp lại các số đã trúng rồi đó, bạn tìm kiếm và tham khảo đi.
-
RE: số ngẫu nhiên duy nhất, không trùng lặp
ongke0711 > 20-02-24, 09:58 PM
(19-02-24, 09:37 PM)btamsgn Đã viết: Nhờ các ban chỉ giúp mình mã để tạo tạo số ngẫu nhiên từ 1 to 15, không trùng lặp và duy nhất
Giải thuật này cũng đơn giản thôi.
- Chạy lấy số ngẫu nhiên.
- Lưu số vừa lấy vào một đối tượng nào đó chứa nó như: DAO Recordset, Array, Collection, Dictionnary.
- Tiếp tục chạy lấy số ngẫu nhiên và đối chiếu với danh sách lưu, nếu đã có rồi thì "Loop" chạy lấy số tiếp đến khi không trùng --> rồi lưu tiếp.
- Khi danh sách đã lưu đủ 15 số thì thoát vòng lặp.
- Xong.
Mã PHP:Option Explicit
Sub laySoNgauNhien(soketqua As Long, gioiHanSo As Long)
Dim soNgauNhien As Long, i As Long
Dim cacSoDaDung As Object 'New Dictionary'
If soketqua > gioiHanSo Then Exit Sub
Set cacSoDaDung = CreateObject("Scripting.Dictionary")
For i = 1 To soketqua
Do
soNgauNhien = Int((gioiHanSo * Rnd) + 1)
Loop While cacSoDaDung.Exists(soNgauNhien)
cacSoDaDung.Add soNgauNhien, soketqua
Debug.Print "So ngau nhien " & i & ": " & soNgauNhien
Next i
Set cacSoDaDung = Nothing
End Sub
Sub testRandom()
laySoNgauNhien 5, 15
End Sub -
RE: số ngẫu nhiên duy nhất, không trùng lặp
btamsgn > 20-02-24, 11:16 PM
sau khi kiểm tra số vẫn bị trùng lặp
(20-02-24, 09:58 PM)ongke0711 Đã viết:
(19-02-24, 09:37 PM)btamsgn Đã viết: Nhờ các ban chỉ giúp mình mã để tạo tạo số ngẫu nhiên từ 1 to 15, không trùng lặp và duy nhất
Giải thuật này cũng đơn giản thôi.
- Chạy lấy số ngẫu nhiên.
- Lưu số vừa lấy vào một đối tượng nào đó chứa nó như: DAO Recordset, Array, Collection, Dictionnary.
- Tiếp tục chạy lấy số ngẫu nhiên và đối chiếu với danh sách lưu, nếu đã có rồi thì "Loop" chạy lấy số tiếp đến khi không trùng --> rồi lưu tiếp.
- Khi danh sách đã lưu đủ 15 số thì thoát vòng lặp.
- Xong.
Mã PHP:Option Explicit
Sub laySoNgauNhien(soketqua As Long, gioiHanSo As Long)
Dim soNgauNhien As Long, i As Long
Dim cacSoDaDung As Object 'New Dictionary'
If soketqua > gioiHanSo Then Exit Sub
Set cacSoDaDung = CreateObject("Scripting.Dictionary")
For i = 1 To soketqua
Do
soNgauNhien = Int((gioiHanSo * Rnd) + 1)
Loop While cacSoDaDung.Exists(soNgauNhien)
cacSoDaDung.Add soNgauNhien, soketqua
Debug.Print "So ngau nhien " & i & ": " & soNgauNhien
Next i
Set cacSoDaDung = Nothing
End Sub
Sub testRandom()
laySoNgauNhien 5, 15
End Sub -
RE: số ngẫu nhiên duy nhất, không trùng lặp
ongke0711 > 21-02-24, 03:25 PM
(20-02-24, 11:16 PM)btamsgn Đã viết: sau khi kiểm tra số vẫn bị trùng lặp
Không biết phương pháp bạn kiểm tra như thế nào, post lên đây để sửa lỗi.
Cách tôi kiểm tra như file hình động đính kèm:
- Lấy 15 kết quả, chạy test 500 lần
- Kiểm tra trùng bằng hàm.
- Test luôn trường hợp số giới hạn chỉ từ 1 - 5 để tăng khả năng trùng và cũng test 500 lần.
- Test luôn giới hạn từ 1 -100
-
RE: số ngẫu nhiên duy nhất, không trùng lặp
btamsgn > 21-02-24, 05:05 PM
Minh đính kèm file ban tham khảo
https://drive.google.com/file/d/1o5zp4xE...sp=sharing
sau khi kiểm tra bị lặp lại -
RE: số ngẫu nhiên duy nhất, không trùng lặp
ongke0711 > 21-02-24, 08:20 PM
(21-02-24, 05:05 PM)btamsgn Đã viết: Minh đính kèm file ban tham khảo
https://drive.google.com/file/d/1o5zp4xE...sp=sharing
sau khi kiểm tra bị lặp lại
Thứ nhất: bạn chỉ đề cập "tạo số ngẫu nhiên từ 1 to 15 không trùng lập và duy nhất" (đã không trùng rồi còn duy nhất). Khi đó các thành viên đã code theo hướng tạo một lúc 15 số ngẫu nhiên không trùng một lúc. Giờ đến khi gặp file mẫu thì lại khác chút là có nút bấm và mỗi lần bấm là chỉ tạo 1 số. Thêm yếu tố này là code nó phải theo một kiểu khác.
Thứ hai: bạn phải đọc và test thật kỹ cách code nó hoạt động rồi mới áp dụng.
- Cái hàm laySoNgauNhien (...) nó chạy liên tục trong hàm cho đến hết số cần lấy và trả kết quả về. Khi chạy trong hàm thì nó mới kiểm tra cái Dictionary có tồn tại số đã chọn chưa để loại ra.
- Lý thuyết: muốn đổi cái Sub thành Hàm thì đâu phải đổi chữ "Sub --> Function" là đủ đâu, nó là ép kiểu. Phải khai báo Function abc() As Long, nếu không khai tường mình thì nó gán thành Variant, tốn bộ nhớ, không biết nó rốt cuộc là kiểu dữ liệu gì.
- Điểm sai quan trọng nhất gây trùng:
+ Hàm laySoNgauNhien (...): mỗi khi bấm Spin, nó gọi chạy lại cái hàm laySoNgauNhien(),
+ Mà hàm laSoNgauNhien() mỗi khi khởi khai, nó lại tạo mới cái Dictionary (Set cacSoDaDung = CreateObject("Scripting.Dictionary") thì còn danh sách số cũ đã quay đâu mà đối chiếu loại trùng???
==> Túm lại code nút Spin của bạn: mội khi bấm thì cái danh sách trả về 0.
Tôi đã nói code thể hiện giải thuật và bạn có thể dùng DAO recordset để lưu thay vì Dictionary. Không check bằng Dictionary mà check thẳng Table. Còn nếu dùng Dictionary thì ngâm cứu biến toàn cục.