Tạo dãy số ngẫu nhiên không trùng

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,912
Trên diển đàn GPE đã có rất nhiều bài viết nói về vấn đề này!
Tôi cũng đã tham khảo rất nhiều code ở các trang nước ngoài nhưng thấy rằng hầu hết đều viết rất khó hiểu và dài dòng!
Trong 1 dịp tình cờ khi nghiên cứu về Dictionary Object, tôi nhận thấy rằng nó có khả năng làm được điều này mà code lại cực kỳ đơn giản
Thuật toán dựa vào định nghĩa của Dictionary có đoạn: Key là những phần tử duy nhất trong Keys
Tôi đã xây dựng code như sau:
PHP:
Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long)
  'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9
  On Error Resume Next
  If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
  With CreateObject("Scripting.Dictionary")
    Do
      .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
    Loop Until .Count = Amount
    UniqueRandomNum = WorksheetFunction.Transpose(.Keys)
  End With
End Function
Cú pháp hàm:
PHP:
=UniqueRandomNum(Số nhỏ, Số lớn, bao nhiêu số cần tạo)
Giả sử các bạn muốn tạo ra 30 số ngẩu nhiên không trùng nằm trong khoảng từ 1 đến 100, các bạn làm như sau:
- Quét chọn 30 cell tùy ý theo chiều dọc, chẳng hạn là A1:A30
- Gõ vào thanh Formula công thức =UniqueRandomNum(1,100,30)
- Bấm tổ hợp phím Ctrl + Shift + Enter
Hãy thí nghiệm với đoạn Test sau:
PHP:
Sub Test()
  Range("A1:A30").Value = UniqueRandomNum(1, 100, 30)
End Sub
--------------
Ghi chú: Dictionary Object còn làm được nhiều thứ khác nữa, chẳng hạn có thể xây dựng hàm trích lọc các phần tử duy nhất (ngẫu nhiên và duy nhất đã làm được, đương nhiên duy nhất sẽ càng dể hơn)
 

File đính kèm

Lần chỉnh sửa cuối:
Hi mọi ngươi,
Mình có 1 bài toán quá khó khăn với mình nhưng chắc khá dễ dàng với nhưng cao thủ trong diễn đàn.
Mình đang cần 1 hàm random không trùng trong 1 dãy số cố định và đồng thời loại bỏ 1 vài số đặc biệt trong dãy số này.
Ví dụ cụ thể như sau:
Mình cần random không trùng lặp khoảng 600-700 số trong dãy từ 6000-6999 nhưng đồng thời có 1 vài số đặc biệt mình cũng không muốn lặp lại trong dãy này như 6969,6888,6999,6789 và 1 vài số cụ thể khác.
Mọi người có thể chỉnh sửa hàm này theo mô tả bên trên dùm mình được không?
P/S mình khá mù về mảng này nên mong mọi người giúp đỡ.
 
Upvote 0
Chào các anh, em rất vui khi tìm được công thức excel của anh về Tạo dãy số ngẫu nhiên không trùng tại thread này https://www.giaiphapexcel.com/diendan/threads/tạo-dãy-số-ngẫu-nhiên-không-trùng.27286/
Nó giúp ích em nhiều trong công việc, tuy nhiên em chỉ xài được nó khi khối theo cột và Ctrl+Shift+Enter, lúc này kết quả sẽ trả ra ngẫu nhiên như anh nói.
tuy nhiên nếu em khối theo dòng và Ctrl+Shift+Enter thì ra kết quả không ngẫu nhiên mà hoàn toàn giống nhau.
Anh cho em hỏi có cách nào để sửa lỗi này không ạ, em cám ơn anh nhiều.
 
Upvote 0
Chào các anh, em rất vui khi tìm được công thức excel của anh về Tạo dãy số ngẫu nhiên không trùng tại thread này https://www.giaiphapexcel.com/diendan/threads/tạo-dãy-số-ngẫu-nhiên-không-trùng.27286/
Nó giúp ích em nhiều trong công việc, tuy nhiên em chỉ xài được nó khi khối theo cột và Ctrl+Shift+Enter, lúc này kết quả sẽ trả ra ngẫu nhiên như anh nói.
tuy nhiên nếu em khối theo dòng và Ctrl+Shift+Enter thì ra kết quả không ngẫu nhiên mà hoàn toàn giống nhau.
Anh cho em hỏi có cách nào để sửa lỗi này không ạ, em cám ơn anh nhiều.
Cái này không phải là lỗi. Đây là tác giả muốn hiển thị kết quả như vậy.
Nếu muốn thành dòng, trong code của link trên, thử thay dòng trên bằng dòng dưới xem sao
Mã:
 UniqueRandomNum = WorksheetFunction.Transpose(.Keys)
Mã:
 UniqueRandomNum = .Keys
 
Upvote 0
Chào các anh, em rất vui khi tìm được công thức excel của anh về Tạo dãy số ngẫu nhiên không trùng tại thread này https://www.giaiphapexcel.com/diendan/threads/tạo-dãy-số-ngẫu-nhiên-không-trùng.27286/
Nó giúp ích em nhiều trong công việc, tuy nhiên em chỉ xài được nó khi khối theo cột và Ctrl+Shift+Enter, lúc này kết quả sẽ trả ra ngẫu nhiên như anh nói.
tuy nhiên nếu em khối theo dòng và Ctrl+Shift+Enter thì ra kết quả không ngẫu nhiên mà hoàn toàn giống nhau.
Anh cho em hỏi có cách nào để sửa lỗi này không ạ, em cám ơn anh nhiều.
Bạn thử.Chỉnh 1 chút không biết có đúng ý không.
Mã:
Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long, Optional ByVal dk As Boolean = True)
  'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9
  On Error Resume Next
  If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
  With CreateObject("Scripting.Dictionary")
    Do
      .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
    Loop Until .Count = Amount
    If dk = True Then
        UniqueRandomNum = WorksheetFunction.Transpose(.Keys)
    Else
        UniqueRandomNum = (.Keys)
    End If
  End With
End Function
Mã:
=UniqueRandomNum(23,30,5,0)
=UniqueRandomNum(23,30,5,1)
 
Upvote 0
Cái này không phải là lỗi. Đây là tác giả muốn hiển thị kết quả như vậy.
Nếu muốn thành dòng, trong code của link trên, thử thay dòng trên bằng dòng dưới xem sao
Mã:
 UniqueRandomNum = WorksheetFunction.Transpose(.Keys)
Mã:
 UniqueRandomNum = .Keys
dạ cám ơn anh, nhờ anh em đãchỉnh lại được công thức và làm được. Một lần nữa cám ơn các anh trong diễn đàn, kiến thức của các anh thật vô biên
Bài đã được tự động gộp:

Bạn thử.Chỉnh 1 chút không biết có đúng ý không.
Mã:
Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long, Optional ByVal dk As Boolean = True)
  'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9
  On Error Resume Next
  If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
  With CreateObject("Scripting.Dictionary")
    Do
      .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
    Loop Until .Count = Amount
    If dk = True Then
        UniqueRandomNum = WorksheetFunction.Transpose(.Keys)
    Else
        UniqueRandomNum = (.Keys)
    End If
  End With
End Function
Mã:
=UniqueRandomNum(23,30,5,0)
=UniqueRandomNum(23,30,5,1)
dạ em cám ơn anh, em đã thử và làm được ạ!
 
Upvote 0
Bạn thử.Chỉnh 1 chút không biết có đúng ý không.
Mã:
Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long, Optional ByVal dk As Boolean = True)
  'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9
  On Error Resume Next
  If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
  With CreateObject("Scripting.Dictionary")
    Do
      .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
    Loop Until .Count = Amount
    If dk = True Then
        UniqueRandomNum = WorksheetFunction.Transpose(.Keys)
    Else
        UniqueRandomNum = (.Keys)
    End If
  End With
End Function
Mã:
=UniqueRandomNum(23,30,5,0)
=UniqueRandomNum(23,30,5,1)
Nếu chỉ lấy số nguyên thì thuật toán này không tốt.
Nên viết sao cho kết quả tương thích với mọi dạng của vùng công thức (1 dòng, 1 cột hoặc bảng nhiều dòng nhiều cột) và có thể bỏ luôn tham số số lượng số cần lấy.
 
Upvote 0
Nếu chỉ lấy số nguyên thì thuật toán này không tốt.
Nên viết sao cho kết quả tương thích với mọi dạng của vùng công thức (1 dòng, 1 cột hoặc bảng nhiều dòng nhiều cột) và có thể bỏ luôn tham số số lượng số cần lấy.
Hi em sửa theo bài 1 thôi anh.
 
Upvote 0
Hi em sửa theo bài 1 thôi anh.
Bài đó tròn 10 năm rồi bạn (thật trùng hợp), nó lạc hậu rồi :D.
Mã:
Function UniqueRandomNum(Bottom As Long, Top As Long)
    Application.Volatile
    Dim CallerRng As Range, NumberSet() As Long, Result() As Long, i As Long, j As Long, k As Long, n As Long
    ReDim NumberSet(1 To Top - Bottom + 1)
    For i = Bottom To Top
        n = n + 1
        NumberSet(n) = i
    Next
    Set CallerRng = Application.Caller
    ReDim Result(1 To CallerRng.Rows.Count, 1 To CallerRng.Columns.Count)
    Randomize
    For i = 1 To UBound(Result, 1)
        For j = 1 To UBound(Result, 2)
            k = Int(Rnd() * n) + 1
            Result(i, j) = NumberSet(k)
            NumberSet(k) = NumberSet(n)
            n = n - 1
        Next
    Next
    UniqueRandomNum = Result
End Function
 

File đính kèm

Upvote 0
Bài đó tròn 10 năm rồi bạn (thật trùng hợp), nó lạc hậu rồi :D.
Mã:
Function UniqueRandomNum(Bottom As Long, Top As Long)
    Application.Volatile
    Dim CallerRng As Range, NumberSet() As Long, Result() As Long, i As Long, j As Long, k As Long, n As Long
    ReDim NumberSet(1 To Top - Bottom + 1)
    For i = Bottom To Top
        n = n + 1
        NumberSet(n) = i
    Next
    Set CallerRng = Application.Caller
    ReDim Result(1 To CallerRng.Rows.Count, 1 To CallerRng.Columns.Count)
    Randomize
    For i = 1 To UBound(Result, 1)
        For j = 1 To UBound(Result, 2)
            k = Int(Rnd() * n) + 1
            Result(i, j) = NumberSet(k)
            NumberSet(k) = NumberSet(n)
            n = n - 1
        Next
    Next
    UniqueRandomNum = Result
End Function
Anh ơi, em chưa hiểu được code tạm thời chỉ có thể dùng, có cách nào chạy random trong mảng dữ liệu cho trước không ạ (chữ)
Mấy code trên em dùng đều bị lỗi (chỉ bị khi khi sử dụng userform để thực hiện call sub****) => hiện kết quả cũ lên bảng tính (không thể random) ạ
em cảm ơn nhiều ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Đề tài này cũng lâu lắm rồi bạn à (năm 2009) và sau đó đã được cải tiến rất nhiều
Mã:
Function UniqueRandNum(ByVal Bottom As Long, ByVal Top As Long, ByVal Amount As Long)
  Dim i As Long, lPos As Long, n As Long, lTmp As Long, idx As Long
  'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9
  If Top > Bottom Then
    If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
    ReDim arr(Bottom To Top) As Long
    ReDim aDes(1 To Amount, 1 To 1)
    n = Top - Bottom + 1
    For i = 1 To Amount
      idx = n + Bottom - 1
      lPos = Int(Rnd() * n) + Bottom
      If arr(lPos) = 0 Then arr(lPos) = lPos
      If arr(idx) = 0 Then arr(idx) = idx
      aDes(i, 1) = arr(lPos)
      lTmp = arr(lPos): arr(lPos) = arr(idx): arr(idx) = lTmp
      n = n - 1
    Next
    UniqueRandNum = aDes
   End If
End Function
Dạ cháu dùng sự kiện open và call ... thì kết quả không còn random ạ huhu
 
Upvote 0
Dạ cháu dùng sự kiện open và call ... thì kết quả không còn random ạ huhu
Lâu lắm không đụng đến hàm này rồi nên cũng quên khá nhiều
Bạn thử sửa lại thế này xem:
Mã:
Function UniqueRandNum(ByVal Bottom As Long, ByVal Top As Long, Optional ByVal Amount As Long)
  Dim i As Long, lPos As Long, n As Long, lTmp As Long, idx As Long
  'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9
  If Top > Bottom Then
    If (Amount > Top - Bottom + 1) Or (Amount <= 0) Then Amount = Top - Bottom + 1
    ReDim arr(Bottom To Top)
    ReDim aDes(1 To Amount, 1 To 1)
    n = Top - Bottom + 1
    Randomize
    For i = 1 To Amount
      idx = n + Bottom - 1
      lPos = Int(Rnd() * n) + Bottom
      If arr(lPos) = vbNullString Then arr(lPos) = lPos
      If arr(idx) = vbNullString Then arr(idx) = idx
      aDes(i, 1) = arr(lPos)
      lTmp = arr(lPos): arr(lPos) = arr(idx): arr(idx) = lTmp
      n = n - 1
    Next
    UniqueRandNum = aDes
   End If
End Function
 
Upvote 0
Lâu lắm không đụng đến hàm này rồi nên cũng quên khá nhiều
Bạn thử sửa lại thế này xem:
Mã:
Function UniqueRandNum(ByVal Bottom As Long, ByVal Top As Long, Optional ByVal Amount As Long)
  Dim i As Long, lPos As Long, n As Long, lTmp As Long, idx As Long
  'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9
  If Top > Bottom Then
    If (Amount > Top - Bottom + 1) Or (Amount <= 0) Then Amount = Top - Bottom + 1
    ReDim arr(Bottom To Top)
    ReDim aDes(1 To Amount, 1 To 1)
    n = Top - Bottom + 1
    Randomize
    For i = 1 To Amount
      idx = n + Bottom - 1
      lPos = Int(Rnd() * n) + Bottom
      If arr(lPos) = vbNullString Then arr(lPos) = lPos
      If arr(idx) = vbNullString Then arr(idx) = idx
      aDes(i, 1) = arr(lPos)
      lTmp = arr(lPos): arr(lPos) = arr(idx): arr(idx) = lTmp
      n = n - 1
    Next
    UniqueRandNum = aDes
   End If
End Function
Cháu cảm ơn nhiều ạ, code chạy ok ạ, chỉ có một điều là sau nhiều lần thử, thi thoảng làm treo file ạ.
Mã:
Sub test()
Dim ch(), da(), i As Long
  tongsoch = 10
  ch = UniqueRd(1, Sheet1.Range("J1").Value, 10)
  Sheet2.Cells(2, 3).Resize(1, 10) = WorksheetFunction.Transpose(ch)
  For i = 3 To tongsoch + 2
    da = UniqueRd(1, 4, 4)
    Sheet2.Cells(3, i).Resize(4, 1) = da
  Next i

End Sub
 
Upvote 0
Cháu cảm ơn nhiều ạ, code chạy ok ạ, chỉ có một điều là sau nhiều lần thử, thi thoảng làm treo file ạ.
Mã:
Sub test()
Dim ch(), da(), i As Long
  tongsoch = 10
  ch = UniqueRd(1, Sheet1.Range("J1").Value, 10)
  Sheet2.Cells(2, 3).Resize(1, 10) = WorksheetFunction.Transpose(ch)
  For i = 3 To tongsoch + 2
    da = UniqueRd(1, 4, 4)
    Sheet2.Cells(3, i).Resize(4, 1) = da
  Next i

End Sub
Thử dùng hàm tự tạo
Mã:
Function NgauNhienKhongTrung(ByVal Bottom&, ByVal Top&, Optional ByVal N& = 0, Optional ByVal bCapNhat As Boolean = False)
  Dim sArr(), Res() As Long, D&, i&, k&
  If bCapNhat Then Application.Volatile ' Thay doi ngau nhien khi bam F9
  If Top > Bottom Then
    D = Top - Bottom + 1
    If (N > D) Or (N <= 0) Then N = D
    ReDim sArr(1 To D)
    ReDim Res(1 To N, 1 To 1)
    Randomize
    For i = 1 To N
      k = Int(Rnd() * D) + 1
      If sArr(k) = Empty Then Res(i, 1) = k + Bottom - 1 Else Res(i, 1) = sArr(k) + Bottom - 1
      If sArr(D) = Empty Then sArr(k) = D Else sArr(k) = sArr(D)
      D = D - 1
    Next
    NgauNhienKhongTrung = Res
   End If
End Function
 
Upvote 0
Thử dùng hàm tự tạo
Mã:
Function NgauNhienKhongTrung(ByVal Bottom&, ByVal Top&, Optional ByVal N& = 0, Optional ByVal bCapNhat As Boolean = False)
  Dim sArr(), Res() As Long, D&, i&, k&
  If bCapNhat Then Application.Volatile ' Thay doi ngau nhien khi bam F9
  If Top > Bottom Then
    D = Top - Bottom + 1
    If (N > D) Or (N <= 0) Then N = D
    ReDim sArr(1 To D)
    ReDim Res(1 To N, 1 To 1)
    Randomize
    For i = 1 To N
      k = Int(Rnd() * D) + 1
      If sArr(k) = Empty Then Res(i, 1) = k + Bottom - 1 Else Res(i, 1) = sArr(k) + Bottom - 1
      If sArr(D) = Empty Then sArr(k) = D Else sArr(k) = sArr(D)
      D = D - 1
    Next
    NgauNhienKhongTrung = Res
   End If
End Function
Cảm ơn bác nhiều ạ
 
Upvote 0
Thử dùng hàm tự tạo
Mã:
Function NgauNhienKhongTrung(ByVal Bottom&, ByVal Top&, Optional ByVal N& = 0, Optional ByVal bCapNhat As Boolean = False)
  Dim sArr(), Res() As Long, D&, i&, k&
  If bCapNhat Then Application.Volatile ' Thay doi ngau nhien khi bam F9
  If Top > Bottom Then
    D = Top - Bottom + 1
    If (N > D) Or (N <= 0) Then N = D
    ReDim sArr(1 To D)
    ReDim Res(1 To N, 1 To 1)
    Randomize
    For i = 1 To N
      k = Int(Rnd() * D) + 1
      If sArr(k) = Empty Then Res(i, 1) = k + Bottom - 1 Else Res(i, 1) = sArr(k) + Bottom - 1
      If sArr(D) = Empty Then sArr(k) = D Else sArr(k) = sArr(D)
      D = D - 1
    Next
    NgauNhienKhongTrung = Res
   End If
End Function
Em xin chào anh! Em muốn tạo một tập hợp số ngẫu nhiên từ một tập hợp cho trước thì làm như thế nào ạ?, ví dụ tập hợp cho trước là từ 100 đến 1000 nhưng bỏ đi phần tử 101,102,501,502... (các phần tử bỏ đi tùy ý), từ tập đó ta lấy ngẫu nhiên 500 số không trùng chẳng hạn, xin anh giúp đỡ ạ!
 
Upvote 0
vâng, danh sách số bỏ đi là 10 số từ 500 đến 509 chẳng hạn ạ, tùy ý ở đây nghĩa là 10 số bỏ đi đó mình có thể thay đổi được ạ, không cố định là 500 đến 509
Thử hàm tự tạo
cú pháp ví dụ: =xyz(100,500,{200;201;202})
Kết qua trả về 1 chuỗi
Mã:
Function xyz(dau, cuoi, loaitru)
Dim mang, Kq
Dim lo, ol
Dim i, j, k
ReDim mang(dau To cuoi)
For Each j In loaitru
    mang(j) = 1
Next j
For j = dau To cuoi
    If mang(j) = "" Then
        mang(dau + k) = j
        k = k + 1
    End If
Next j
ReDim Preserve mang(dau To k + dau)
lo = k
ol = lo
ReDim Kq(1 To lo)
Randomize
For i = lo To 1 Step -1
    j = Int(Rnd() * i) + dau
    Kq(i) = mang(j)
    mang(j) = mang(ol + dau)
    ol = ol - 1
Next i
xyz = Join(Kq)
End Function
---
Dãy số phải là nguyên dương nhé bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Thử hàm tự tạo
cú pháp ví dụ: =xyz(100,500,{200;201;202})
Kết qua trả về 1 chuỗi
Mã:
Function xyz(dau, cuoi, loaitru)
Dim mang, Kq
Dim lo, ol
Dim i, j, k
ReDim mang(dau To cuoi)
For Each j In loaitru
    mang(j) = 1
Next j
For j = dau To cuoi
    If mang(j) = "" Then
        mang(dau + k) = j
        k = k + 1
    End If
Next j
ReDim Preserve mang(dau To k + dau)
lo = k
ol = lo
ReDim Kq(1 To lo)
Randomize
For i = lo To 1 Step -1
    j = Int(Rnd() * i) + dau
    Kq(i) = mang(j)
    mang(j) = mang(ol + dau)
    ol = ol - 1
Next i
xyz = Join(Kq)
End Function
---
Dãy số phải là nguyên dương nhé bạn
Dạ, em cần sự trợ giúp như sau ạ:
1/: em muốn tạo dãy số ngẫu nhiên từ một tập số cho trước có loại trừ đi một số phần tử, và muốn từng số đó hiển thị theo từng dòng và dãy số đó là số nguyên >=0, (em cũng thử test theo function của anh nhưng không hiểu sao nó thiếu mất mấy số nằm ngoài tập loại trừ em cho vào)
2/: em thử kết hợp function với điều kiện khác để loại số, như trong file đính kèm thì em kết hợp kiểu "bé tập đi" thui ạ, nhưng gặp vấn đề lỗi out stack space!, bấm sub nó chỉ quay đến một mức rồi dừng lại, liệu có cách nào khắc phục không ạ?
 

File đính kèm

Upvote 0
Dạ, em cần sự trợ giúp như sau ạ:
1/: em muốn tạo dãy số ngẫu nhiên từ một tập số cho trước có loại trừ đi một số phần tử, và muốn từng số đó hiển thị theo từng dòng và dãy số đó là số nguyên >=0, (em cũng thử test theo function của anh nhưng không hiểu sao nó thiếu mất mấy số nằm ngoài tập loại trừ em cho vào)
2/: em thử kết hợp function với điều kiện khác để loại số, như trong file đính kèm thì em kết hợp kiểu "bé tập đi" thui ạ, nhưng gặp vấn đề lỗi out stack space!, bấm sub nó chỉ quay đến một mức rồi dừng lại, liệu có cách nào khắc phục không ạ?
Cách của bạn có lẽ phải chờ rất lâu mới có kết quả.
Theo code của bạn: lập tổ hợp chập 50 của 101 phần tử, sau đó so sánh với 10 số cho trước.
Dùng hàm COMBIN(101,50) để tính, số tổ hợp có thể > 10^29, đây là chưa kể trường hợp lặp lại nhiều lần 1 tổ hợp -> để so sánh đạt yêu cầu với 10 số cho trước có lẽ phải chờ hơi lâu
Tốt nhất là bạn loại trừ 10 số ngay từ đầu khỏi tập cho trước, sau đó lấy ngẫu nhiên.
Bài đã được tự động gộp:

@domjnjc
Hàm xyz ở trên, bạn nhập thế nào
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom