• số ngẫu nhiên duy nhất, không trùng lặp
  • 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 0 To 14
        Numbers
    (i) = 1
    Next i

    For 14 To 0 Step -1
        j 
    Int((1) * Rnd)
        temp Numbers(i)
        Numbers(i) = Numbers(j)
        Numbers(j) = temp
    Next i

    For 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 0 To 14
        Numbers
    (i) = 1
    Next i

    For 14 To 0 Step -1
        j 
    Int((1) * Rnd)
        temp Numbers(i)
        Numbers(i) = Numbers(j)
        Numbers(j) = temp
    Next i

    For 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 LonggioiHanSo As Long)
        Dim soNgauNhien As LongAs Long
        Dim cacSoDaDung 
    As Object    'New Dictionary'
        
        
    If soketqua gioiHanSo Then Exit Sub
        
        Set cacSoDaDung 
    CreateObject("Scripting.Dictionary")

        For 1 To soketqua
            
    Do
                soNgauNhien Int((gioiHanSo Rnd) + 1)
            Loop While cacSoDaDung.Exists(soNgauNhien)
            
            cacSoDaDung
    .Add soNgauNhiensoketqua
            Debug
    .Print "So ngau nhien " ": " soNgauNhien
        Next i
        
        Set cacSoDaDung 
    Nothing
    End Sub


    Sub testRandom
    ()
        laySoNgauNhien 515
    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 LonggioiHanSo As Long)
        Dim soNgauNhien As LongAs Long
        Dim cacSoDaDung 
    As Object    'New Dictionary'
        
        
    If soketqua gioiHanSo Then Exit Sub
        
        Set cacSoDaDung 
    CreateObject("Scripting.Dictionary")

        For 1 To soketqua
            
    Do
                soNgauNhien Int((gioiHanSo Rnd) + 1)
            Loop While cacSoDaDung.Exists(soNgauNhien)
            
            cacSoDaDung
    .Add soNgauNhiensoketqua
            Debug
    .Print "So ngau nhien " ": " soNgauNhien
        Next i
        
        Set cacSoDaDung 
    Nothing
    End Sub


    Sub testRandom
    ()
        laySoNgauNhien 515
    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


    [Hình: za374bc.gif]


    [Hình: f592K94.png]
  • 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.