Hỏi về cách lập một bảng các số ngẫu nhiên.

Liên hệ QC

dvu58

Thành viên thường trực
Tham gia
29/4/07
Bài viết
298
Được thích
378
Tôi có một vấn đề nhỏ cần sự giúp đỡ:

Tôi muốn lập một bảng (chừng vài trăm số) theo yêu cầu:
+ Số đó là số ngẫu nhiên.
+ Tất cả các số đều có 4 chữ số (VD: 2371; 4835;....)
+ Không có số giống nhau.

Dùng hàm RAND() không giải quyết được các yêu cầu trên. Phải chăng phải dùng phối hợp nhiều hàm hoặc phải dùng chương trình viết riêng?

Mong có sự giúp đỡ. Cảm ơn nhiều.

_______________________________________
-0-/. Excel là chiếc đũa thần
Các bạn là thầy phù thủy
"Giải pháp excel" là thế giới thần tiên.
 
Có một cách khác để không cần dùng hàm randbetween hay phải cái Analysis ToolPak đó là dùng hàm Rand() cách dùng như sau:
Để lấy một con số trong khoảng từ a đến b
= Rand()*(b-a) + a
Nếu là số có chính xác 4 chữ số (và là số nguyên) bạn thêm vào hàm round():
= Round(Rand()*(9999-1000),0) + 1000
Và cũng như bác ttphong2007 đề cập, việc cho ra tất các các con số đều khác nhau là chuyện hên xui. Tuy nhiên bạn cũng có thể kiểm soát chuyện hên xui này bằng cách đếm xem có phần tử nào trong bảng số ngẩu nhiên này lặp lại 2 lần không. Nếu có thì thay bằng số khác. Hành kiểm tra số, thay bằng số khác chỉ có thể thực hiện sau khi bạn chép và dán giá trị trên chính bảng số liệu đó. Chứ không thì cứ mỗi lần bạn cập nhận số liệu thì hàm rand() lại trả ra cho bạn một giá trị khác.
 
Tôi muốn lập một bảng (chừng vài trăm số) theo yêu cầu:
+ Số đó là số ngẫu nhiên.
+ Tất cả các số đều có 4 chữ số (VD: 2371; 4835;....)
+ Không có số giống nhau.
Nêu lại iêu cầu đề bài:
Bạn cần từ 200 - 999 số có 4 chữ số 1 cách ngẫu nhiên không trùng
từ 1.000 cho đến 9.999 sẽ có gần 9.000 số;
Từ 9.000 lấy ra ngẫu nhiên 900 số thì mình có cách sau:
dùng vòng lặp for đề tạo chuỗi
StrC="001002003. . . . .099100101. . . . . . .999"
Dùng cách cắt đảo trộn ngẫu nhiên các vị trí trong chuỗi
VD
Mã:
 for ii=1 to 99
   for ij= 1 to 99
         ViTri=3*Int(RND()*ij + 9)
         Chuoi=Mid(Chuoi, ViTri+1, 3000) & leftChuoi,ViTri)
    Next ij
     Chuoi=Mid(Chuoi, 7, 3000)
 Next ii
'Giống như kiểu sào bài vậy; sau đó cắt từng Đvị nhóm 3 anh ; biến thành số & Đem cộng với 1.000 & rải vô các ô của trang tính;
 
Lần chỉnh sửa cuối:
Không biết Dvu58 đưa ra câu đố này để thách bà con chơi cho vui.

Tuy nhiên mình mến tặng bạn cái code sau. Cái này cho ra 500 con số bao gồm 4 chữ số không trùng hợp (đúng theo yêu cầu).

Nếu thấy 500 con số chưa đủ xài thì bạn cứ tuỳ ý đổi thành 5000 hay 50000 v.v.

Nói chơi cho vui chứ vì mổi con số chỉ có 4 chữ số nên cái code chỉ cho ra lò 9999 con số thôi. Nếu các bạn để loop > 9999 thì bạn làm "ếch seo" thành "ếch ... đứng máy" đấy nha!


Bạn copy cái code này vô VBA module rồi khởi động nó.

--------------------------------------------------
Sub TaoSo()
Dim i As Long
Dim j As Long
Dim ConSo As String

Const UpperBound = 9
Const LowerBound = 0
Const Digits = 4


Randomize
For i = 1 To 500
If Range("A" & i).Text = "" Then

Do
ConSo = ""
For j = 1 To Digits

ConSo = ConSo & Int((UpperBound - LowerBound + 1) * Rnd + LowerBound)
Next j
If Application.WorksheetFunction.CountIf(Range("A:A"), ConSo) = 0 Then
Range("A" & i).Value = "'" & Format(ConSo, "0000")
Exit Do
End If
Loop
End If
Next i

End Sub
----------------------------------------------------------
 
Chỉnh sửa lần cuối bởi điều hành viên:
Chào các bạn,

Cảm ơn bạn digital đã tặng code. Mình xin chỉnh lại chút ít để sử dụng trong trường hợp loại bỏ các con số có 4 chữ số mà bắt đầu là số 0, ví dụ như 0588. Các bạn cũng nên ghi lại đoạn code cũ để sử dụng trong trường hợp cần có số 0 bắt đầu.

Sub RandKoTrung()
Dim i As Long
Dim j As Long
Dim ConSo As String

Const UpperBound = 9
Const LowerBound = 0
Const Digits = 4

Randomize
For i = 1 To 500 'có thể thay đổi số lượng phần tử phát tại đây
If Range("A" & i).Text = "" Then

Do
ConSo = ""
ConSo1 = Int((9 - 1) * Rnd() + 1)
For j = 2 To Digits
ConSo = ConSo & Int((UpperBound - LowerBound + 1) * Rnd + LowerBound)
Next j
ConSo = ConSo1 & ConSo
If Application.WorksheetFunction.CountIf(Range("A:A"), ConSo) = 0 Then
Range("A" & i).Value = "'" & Format(ConSo, "0000")
Exit Do
End If
Loop
End If
Next i
End Sub
Thân,
Thanh Phong
 
Thủ tục tạo số ngẫu nhiên

Quả thật, bài toán bạn đưa ra không đơn giản chút nào. Nó cần bạn đưa vào 2 đối số:
1. Số chữ số cần ghi. Ví dụ 3 chữ số thì các số nằm trong phạm vi 100 < số ghi <=999.
2. Ghi vào bao nhiêu chữ số. Số lần ghi này phải thỏa mãn <= 999-100+1. Ngoài ra nếu ghi theo dòng từ trên xuống, nó còn lệ thuộc ô đầu tiên ghi ở dòng nào ? Ví dụ nếu ô đầu ở dòng 65.500 thì số cần ghi không quá 36 số.
Để giải quyết bài toán này, cần phải có 1 thủ tục trong đó kiểm tra 2 đối số đưa vào có thỏa mãn điều kiện trên không, nếu thỏa mãn tiến hành tạo số ngẫu nhiên. Mỗi số tạo ra trước khi ghi vào ô lại phải kiểm tra đã có chưa ? Nếu chưa ghi vào ô, nếu đã có phải tạo lại cho đến khi thỏa mãn.
Tôi viết Sub SoNgauNghien để làm các công việc đó. Bạn có thể tải về tập tin SoNgauNhien.zip về chạy thử.
Tiến trình của thủ tục này như sau:
1. Ghi 2 giá trị dòng, cốt vào 2 biến rd, c
2. Nhập số chữ số cần ghi vào biến sonhap qua hộp thoại. Do Excel chỉ hiển thị đúng số nhập là 15 chữ số. Nếu sonhap > 15 sẽ báo lỗi.
3. Tính số nhỏ nhất vào biến somin, số lớn nhất vào biến somax. Số lần ghi vào biến solanmax. Kiểm tra xem từ ô đang chọn cho đến ô cuối cùng của bảng tính (dòng 65536) có đủ ô ghi không ? Nếu không đủ tính lại solanmax.
4. Nhập số cần ghi vào biến sonhap qua hộp thoại. Nếu sonhap > solanmax sẽ báo lỗi.
5. Tạo vòng lặp For r = rd To rc để ghi các số ngẫu nhiên từ ô đầu rd đến ô cuối rc. Mỗi số trước khi ghi được kiểm tra bằng cách đếm trong vùng sẽ ghi có số này chưa qua biến laplai. Nếu biến laplai=0 thì ghi, nế laplai>0 thì tạo số mới cho đến khi nào thỏa mãn laplai=0.

‘==========
Sub SoNgauNghien()
Dim MyRange As Object
rd = ActiveCell.Row
c = ActiveCell.Column
sonhap = Application.InputBox("So co bao nhieu chu so ? (0 < sochuso <=15)", "So ngau nhien", 3, , , , , 1)
If sonhap = 0 Or sonhap > 15 Then GoTo baoloi
somin = 10 ^ (sonhap - 1)
somax = Val(String(sonhap, "9"))
solanmax = somax - somin + 1
If rd + solanmax - 1 > 65536 Then
solanmax = 65536 - rd + 1
End If
sonhap = Application.InputBox("Ghi vao bang tinh bao nhieu so ?" & Chr(13) & "<=" & solanmax, "So ngau nhien", solanmax, , , , , 1)
If sonhap = 0 Or sonhap > solanmax Then GoTo baoloi
rc = rd + sonhap - 1
Set MyRange = Range(Cells(rd, c), Cells(rc, c))
MyRange.ClearContents
For r = rd To rc
Do
ngaunhien = Int((somax - somin + 1) * Rnd + somin)
laplai = Application.WorksheetFunction.CountIf(MyRange, ngaunhien)
If laplai = 0 Then
Cells(r, c) = ngaunhien
Exit Do
End If
Loop
Next
Exit Sub
baoloi:
MsgBox "So nhap " & sonhap & " . Ngoai pham vi xu ly !", vbOKOnly, "So ngau nhien"
End Sub
 

File đính kèm

  • SoNgauNghien.zip
    3.7 KB · Đọc: 137
Web KT
Back
Top Bottom