Tạo dãy số ngẫu nhiên trong khoảng không bị trùng lặp.

  • Thread starter Thread starter vanle33
  • Ngày gửi Ngày gửi
Liên hệ QC

vanle33

Thành viên gạo cội
Tham gia
30/10/08
Bài viết
5,938
Được thích
3,991
Giới tính
Nam
Trong Sheet 2 của file đính kèm. Tôi muốn tạo dãy số ngẫu nhiên không trùng trong khoảng (ví dụ từ 0 đến 100).
Dùng hàm RANDBETWEEN nhưng có các giá trị trùng.
Mong các thành viên chỉ giúp cách nào hoặc = công thức để thực hiện được yêu cầu trên.
Xin cảm ơn!
 

File đính kèm






 
Cách này tuy không phải là tuyệt đối nhưng xác suất bị trùng rất thấp, bạn tham khảo.
Đầu tiên dùng hàm Rand() để tạo dãy số ngẫu nhiên.
Tiếp theo, dùng hàm Rank để lấy thứ tự của từng số trong dãy số ngẫu nhiên. Tuỳ thuộc bạn muốn lấy ngẫu nhiên trong phạm vi nào thì chọn range cho phù hợp. Trong sheet 3 mình lấy từ 1-100.
 
Tôi muốn dùng công thức hoặc cách nào đơn giản nhất, không cần dùng VBA!
Kết quả hiển thị ở 100 cell là các số lần lượt từ 1 đến 100 không có số nào trùng với số nào!
Bài đã được tự động gộp:

Cách này tuy không phải là tuyệt đối nhưng xác suất bị trùng rất thấp, bạn tham khảo.
Đầu tiên dùng hàm Rand() để tạo dãy số ngẫu nhiên.
Tiếp theo, dùng hàm Rank để lấy thứ tự của từng số trong dãy số ngẫu nhiên. Tuỳ thuộc bạn muốn lấy ngẫu nhiên trong phạm vi nào thì chọn range cho phù hợp. Trong sheet 3 mình lấy từ 1-100.
Cảm ơn bạn.
Có thể xuất kết quả bảng dạng 10 dòng x 10 cột như trong Sheet 2 file tôi đính kèm ở bài #1 được không bạn?
Tôi muốn in gọn trong 1 trang A4 ngang.
 
Click vô nút "Tạo số" nhe bạn
PHP:
Option Explicit
Sub random()
Dim i&, j&, r&, rng
Dim dic As Object
Set dic = CreateObject("Scripting.dictionary")
rng = Range("B1:K10").Value
For i = 1 To UBound(rng)
    For j = 1 To UBound(rng, 2)
        r = Int(Rnd() * 100) + 1
        Do While dic.exists(r)
            r = Int(Rnd() * 100) + 1
        Loop
        dic.Add r, ""
        rng(i, j) = r
    Next
Next
Range("B1:K10").Value = rng
End Sub
 

File đính kèm

Excel 365 đủ 5 từ
Mã:
=WRAPCOLS(SORTBY(SEQUENCE(100,,0),RANDARRAY(100)),10)
 
@bebo021999 : Muốn thay đổi số ngẫu nhiên lên đến 200 thì thay số 100 màu xanh trong code thành 200 à bác?
Em mù tịt về code! hihi.
@hocexcel_1991 : Cám ơn bạn. Nhưng xin lỗi tôi đã quên nói ở #1 là trong Excel 2010.
 
Một cách dùng công thức. Xác suất 100% ngẫu nhiên.
Dùng sheet3, cột A để tạo 100 số ngẫu nhiên.
Tại A2:
Mã:
=AGGREGATE(15,6,ROW($1:$100)/(COUNTIF($A$1:A1,ROW($1:$100))=0),RANDBETWEEN(1,100-ROWS($1:1)+1))
Kết quả tại sheet2
Tại B2:
Mã:
=INDEX(Sheet3!$A$2:$A$101,(COLUMNS($A:A)-1)*10+ROWS($1:1))
Bài đã được tự động gộp:

@bebo021999 : Muốn thay đổi số ngẫu nhiên lên đến 200 thì thay số 100 màu xanh trong code thành 200 à bác?
Bảo đảm 2 thành phần này cũng thay đổi tương ứng:
Range("B1:K10") => tương ứng 100 cells
r = Int(Rnd() * 100) + 1 ==> thay đổi con số 100
 

File đính kèm

Lần chỉnh sửa cuối:
Loại vấn đề này ở đây có cả đống. Một trong những nơi đề nghi ở bài #2 sẽ có giải pháp. Tại bạn lười hoặc khong biết cách đọc tìm chỗ gần trường hợp của mình.
Cũng có thể do bạn tham, muốn ra bảng 2D thay vì cột dọc.

Cứ ra cột dọc thì dễ, sau đó có cả đống phương pháp chuyển thánh 2D.

Cách dễ nhất để ra cột dọc là:
- Tạo cột phụ bên cạnh đám số cần phân bổ
- Trong cột phụ, ghi hàm Rand()
- Copy/Paste Value cột.
- Sort cột số và cột pju theo cột phụ.
- Tùy tiện bốc ra từ dòng 1 đến dòng N
 
Xác suất tuy rất nhỏ, nhưng có.
Xác suất trùng không thể có.
N ngẫu nhiên đi kèm với N dữ liệu. Khi sắp xếp lại, những ngẫu nhiên bằng nhau sẽ tự động xếp vào vị trí đúng của chúng.
Xác suất một vài dữ liệu bị đứng yên chỗ cũ có thể xảy ra, nhưng rất nhỏ và khong thành vấn đề vì nó vẫn là ngẫu nhiên. Và không có giải thuật nào tránh được cái này,
Xác suất không có dữ liệu nào xếp lại cả cũng có thể xảy ra nhưng chỉ bị khi con số N (số dữ liệu) rất nhỏ. Và không có phương pháp nào tránh được. Chỉ có cách duy nhất là sau khi lấy xong, xem lại thấy nó không đúng ý thì làm lại.

Vấn đè duyu nhất của hàm Rand() là nó bắt đầu bằng Pseudo-Random (ngẫu nhiên giả). Để tránh trường hợp này, trong VBA code người ta dùng ham Randomize để tạo chuỗi Random "hoàn toàn" ngẫu nhiên. Trong bảng tính, người ta gọi buộc Rand() tính lại nhiều lần để vượt qua các lớp (sê-ri) đầu. Random là hàm volatile cho nên buộc nó tính lại rất dễ.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom