PDA

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



dangtien792002
05-12-06, 08:44 PM
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

SA_DQ
05-12-06, 08:52 PM
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
Sub SoNgau40_110()
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
End Sub

ThuNghi
05-12-06, 09:20 PM
Tại phần này có phần lấy số ngẫu nhiên
http://www.giaiphapexcel.com/forum/showthread.php?t=880

levanduyet
09-12-06, 09:46 PM
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

ledungtdc
21-12-06, 11:06 AM
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

nvson
21-12-06, 05:51 PM
Bạn thử code sau để tạo số ngẫu nhiên không trùng lặp:


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

longnh
09-07-09, 04:28 AM
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%C3%A1_tr%C3%ACnh_ng%E1%BA%ABu_nhi%C3%AAn

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)

bjhn
14-10-10, 09:05 AM
Bạn thử code sau để tạo số ngẫu nhiên không trùng lặp:


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?

ndu96081631
14-10-10, 09:10 AM
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%E1%BA%A1o-d%C3%A3y-s%E1%BB%91-ng%E1%BA%ABu-nhi%C3%AAn-kh%C3%B4ng-tr%C3%B9ng
Tôi nghĩ đây là code ngắn nhất đấy! (có cả file đính kèm và ứng dụng)