Có thể tạo hàm tạo số ngẫu nhiên không trùng lặp ?

Liên hệ QC

dangtien792002

Thành viên mới
Tham gia
5/12/06
Bài viết
6
Được thích
1
Có bạn nào biết cách tạo hàm tương tự như hàm randombetween() nhưng mà các số sau không lặp lại.
Ví dụ: khi minh dùng hàm randombetween là tự tạo ra số ngẫu nhiên nhưng nó vẫn có số lặp lại. Bài toán là tạo ra 1 hàm tạo ra các số ngẫu nhiên nhưng không được lặp lại
 
Có cách thô thiển như sau:

Bạn tao chuỗi gồm các số từ min -> max bằng vòng lặp
Sau đó trộn đảo chuỗi này nhiều lần bằng các hàm chiết, cắt & nối chuỗi
Cuối cùng dùng vòng lặp chuyển từng thành viên trong chuỗi này thành số & gán vô đâu đó bạn cần!
BS
Mã:
[b]Sub SoNgau40_110()[/b]
On Error Resume Next
 Dim wJ As Integer, SoNgau As Integer:           Dim StrC As String
 For wJ = 29 To 99
    If wJ Mod 2 = 0 Then StrC = StrC & CStr(wJ) Else StrC = CStr(wJ) & StrC
    If wJ > 40 And wJ < 89 Then
        Randomize:              SoNgau = 9 + Int(wJ * Rnd() - 10)
        StrC = Mid(StrC, 2 * SoNgau + 1, 10) & Left(StrC, 2 * SoNgau) & Mid(StrC, (2 * SoNgau + 11))
    End If
 Next wJ
 Application.ScreenUpdating = 0:            Sheets("C1").Select
 For wJ = 2 To 61
     Range("A" & wJ).Value = 11 + Mid(StrC, 2 * wJ - 3, 2)
 Next wJ
[b]End Sub [/b]
 
Lần chỉnh sửa cuối:
Upvote 0
dangtien792002 đã viết:
Có bạn nào biết cách tạo hàm tương tự như hàm randombetween() nhưng mà các số sau không lặp lại.
Ví dụ: khi minh dùng hàm randombetween là tự tạo ra số ngẫu nhiên nhưng nó vẫn có số lặp lại. Bài toán là tạo ra 1 hàm tạo ra các số ngẫu nhiên nhưng không được lặp lại
Khi bạn đã nói là ngẫu nhiên thì % chắc chắn là có trùng lập lại.

Lê Văn Duyệt
 
Upvote 0
Với công cụ VBA bạn hoàn toàn có thể tạo một hàm như vậy. Mình đã viết rồi và đã thành công, cơ sở như sau:
- Bạn tạo hàm thứ nhất kiểm tra số xem đã có trong mảng hay chưa: đầu vào là một số và một mảng số, đầu ra là true hay false.
- Hàm thứ hai dùng để random số: đầu vào là giới hạn trên hoặc cả trên cả dưới tùy bạn, đầu ra là mảng A() chứa tất cả các số trong giới hạn mà sắp xếp không theo thứ tự (Randomize). Hàm này làm bằng cách gán A(1) bằng 1 số bất kỳ trong giới hạn (có thể sinh bằng random), gán biến đếm bằng 1. Tiếp đến gán liên tiếp biến tạm=Rnd*giới hạn. Mỗi lần gọi sẽ kiểm tra xem tạm đã có trong mảng A hay chưa bằng hàm thứ nhất, nếu chưa thì Redim lại A và thêm tạm vào cuối, đồng thời tăng đếm lên 1. Nếu chưa thì không tăng biến đếm:

Do While dem <= Gioihan 'hoac gioihantren - gioihanduoi
Tam = int(n * Rnd)' Hàm Rnd sinh bất kỳ (thập phân) từ 0 -1 nên phải có int
Randomize
kt = Kiểmtracósốhaychưa(Tempnum, Arrsth)
If kt = False Then
A(i) = Tam
i = i + 1
End If
Loop
Ngay trước khối lệnh này bạn sao lưu lại mảng A vào mảng tạm, Redim lại nó theo i, sau đó lại ném từ mảng tạm vào lại A để tránh mất dữ liệu.
Trước hết bạn cứ tự làm theo hướng dẫn đã nhé. Nếu không làm được mình mới bàn tiếp. Cố lên
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử code sau để tạo số ngẫu nhiên không trùng lặp:
Mã:
Option Explicit
'Thu tuc nay se tao so ngau nhien khong trung lap
Sub Creat_Random()
Dim i As Integer, j As Integer
Dim Matran(), gtri, gtri2
Dim max_i As Integer
'Ban muon tao so ngau nhien tu 1 cho toi max_i ?
'Thay doi gia tri max_i neu ban muon tao so ngau nhien lon hon hoac nho hon
max_i = 100
ReDim Matran(1 To max_i)
For i = 1 To max_i
      Do
         gtri = Round(Rnd() * max_i, 0)
         If gtri = 0 Then GoTo tieptuc
         For j = 1 To i - 1
            If gtri = Matran(j) Then GoTo tieptuc
         Next j
         Matran(i) = gtri
         Exit Do
tieptuc:
       Loop While True
Next i
For i = 1 To max_i
    Cells(ActiveCell.Row + i - 1, ActiveCell.Column) = Matran(i)
Next i
End Sub
Cách sử dụng:
Nhấn Atl+F11 để vào VBA
Nhấn Insert/Module, rồi thên đoạn code trên
Trở về MS Excel (nhấn Alt+Q)
Nhấn Alt+F8 rồi chọn và chạy macro Creat_Random
 
Lần chỉnh sửa cuối:
Upvote 0
Thực ra đầu tiên bạn cần hiểu ngẫu nhiên nghĩa là gì? về vấn đề này bạn có thể tham khảo

http://vi.wikipedia.org/wiki/Quá_trình_ngẫu_nhiên

Mình không muốn đề cập đến vấn đề toán học ở đây tuy nhiên điều khó nhất khi viết hàm ngẫu nhiên là phải đảm bảo phân phối chuẩn.
Nói đơn giản là tôi sẽ lấy ngẫu nhiên một cặp X,Y theo hàm ngẫu nhiên nào đó thì kết quả sẽ như thế này. Xem ảnh đính kèm (10000 điểm với hàm Rand() của Excel thể hiên trên CAD ). bạn sẽ thấy nó phân phối rất đều.

bản thân ngẫu nhiên nó đã bao gồm có thể lặp lại và mọi nỗ lực loại trừ kết quả sẽ mất đi tính ngẫu nhiên.

Trong trường hợp của bạn mình thấy giống với việc đăng ký biển xe ôtô hay xe máy ( biển đã cấp không được có mặt trong lần lấy số tiếp theo)

Giải pháp cho vấn đề này khá đơn giản bằng cách bạn cho thêm một cột phụ có chỉ số từ 1,2... đến số biển còn lại. Sau đó bạn lấy ngẫu nhiên trong cột này thay vì (nếu bốc được biển đã cấp thì bốc lại)
 

File đính kèm

  • ngaunhien.JPG
    ngaunhien.JPG
    95.9 KB · Đọc: 544
Upvote 0
Bạn thử code sau để tạo số ngẫu nhiên không trùng lặp:
Mã:
Option Explicit
'Thu tuc nay se tao so ngau nhien khong trung lap
Sub Creat_Random()
Dim i As Integer, j As Integer
Dim Matran(), gtri, gtri2
Dim max_i As Integer
'Ban muon tao so ngau nhien tu 1 cho toi max_i ?
'Thay doi gia tri max_i neu ban muon tao so ngau nhien lon hon hoac nho hon
max_i = 100
ReDim Matran(1 To max_i)
For i = 1 To max_i
      Do
         gtri = Round(Rnd() * max_i, 0)
         If gtri = 0 Then GoTo tieptuc
         For j = 1 To i - 1
            If gtri = Matran(j) Then GoTo tieptuc
         Next j
         Matran(i) = gtri
         Exit Do
tieptuc:
       Loop While True
Next i
For i = 1 To max_i
    Cells(ActiveCell.Row + i - 1, ActiveCell.Column) = Matran(i)
Next i
End Sub
Cách sử dụng:
Nhấn Atl+F11 để vào VBA
Nhấn Insert/Module, rồi thên đoạn code trên
Trở về MS Excel (nhấn Alt+Q)
Nhấn Alt+F8 rồi chọn và chạy macro Creat_Random

Bạn ơi! Có thể cho mình 1 ví dụ cụ thể được không? Mình chưa học VBA nên không rành lắm ah. Thanks!
Muốn hỏi thêm chút ít ah: nếu muốn tạo số ngầu nhiên có trùng lặp được không bạn?
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn ơi! Có thể cho mình 1 ví dụ cụ thể được không? Mình chưa học VBA nên không rành lắm ah. Thanks!
Muốn hỏi thêm chút ít ah: nếu muốn tạo số ngầu nhiên có trùng lặp được không bạn?
Mời bạn tham khảo bài này:
http://www.giaiphapexcel.com/forum/showthread.php?27286-Tạo-dãy-số-ngẫu-nhiên-không-trùng
Tôi nghĩ đây là code ngắn nhất đấy! (có cả file đính kèm và ứng dụng)
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom