Trang 1/5 1 2 3 4 5 cuốicuối
Hiển thị kết quả tìm kiếm từ 1 đến 10 trên tổng số: 47
  1. #1
    Tham gia ngày
    03 2007
    Nơi Cư Ngụ
    Biên Hòa, Đồng Nai
    Bài gởi
    5,809
    Cảm ơn
    3,447
    Được cảm ơn 6,380 lần trong 2,615 bài viết

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

    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 Code:
    Function UniqueRandomNum(Bottom As LongTop As LongAmount 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 Code:
    =UniqueRandomNum(Số nhỏSố lớnbao 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 Code:
    Sub Test()
      
    Range("A1:A30").Value UniqueRandomNum(110030)
    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)
    Tập tin đính kèm Tập tin đính kèm
    thay đổi nội dung bởi: anhtuan1066, 07-09-09 lúc 01:44 PM


  2. #2
    Tham gia ngày
    03 2007
    Nơi Cư Ngụ
    Biên Hòa, Đồng Nai
    Bài gởi
    5,809
    Cảm ơn
    3,447
    Được cảm ơn 6,380 lần trong 2,615 bài viết
    Tôi xin giả lập 1 file, dùng ứng dụng trên để tạo phòng thi
    - Có 146 sinh viên
    - Tạo 5 phòng thì, mỗi phòng 30 sinh viên được lấy ngẫu nhiên từ dử liệu gốc
    Xem file
    Tập tin đính kèm Tập tin đính kèm


  3. #3
    Tham gia ngày
    06 2009
    Bài gởi
    4
    Cảm ơn
    1
    Được cảm ơn 0 lần trong 0 bài viết

    UniqueRandomNum

    làm sao viết được đoạn code này cho excel 2007 vậy bác ơi.
    em dowload file về thì dùng dược hưng dùng hàm UniqueRandomNum thì kô có trong excel
    em mong bác chỉ cho em cách tạo để có thể dùng ở mọi nơi.
    em cám ơn bác rất nhiều.


  4. #4
    Tham gia ngày
    06 2008
    Bài gởi
    23,550
    Cảm ơn
    13,516
    Được cảm ơn 41,931 lần trong 18,985 bài viết
    Trích Nguyên văn bởi asialhu View Post
    làm sao viết được đoạn code này cho excel 2007 vậy bác ơi.
    em dowload file về thì dùng dược hưng dùng hàm UniqueRandomNum thì kô có trong excel
    em mong bác chỉ cho em cách tạo để có thể dùng ở mọi nơi.
    em cám ơn bác rất nhiều.
    - Bạn mở file tác giả lên, bấm Alt + F11 vào xem người ta viết code gì trong đó
    - Copy toàn bộ code
    - Mở file của bạn lên, cũng bấm Alt + F11 rồi paste code đã copy vào (y chang file gốc)
    Lưu ý: Code này đặt trong 1 Module, vậy bạn cũng phải vào menu Insert\Module (để có 1 Module như người ta) rồi hẳn paste code vào

  5. Có 4 thành viên cảm ơn ndu96081631 về bài viết này:


  6. #5
    Tham gia ngày
    06 2006
    Nơi Cư Ngụ
    Hà Nội
    Bài gởi
    5,564
    Cảm ơn
    7,783
    Được cảm ơn 20,745 lần trong 4,674 bài viết

  7. Thành viên sau cảm ơn PhanTuHuong về bài viết này:


  8. #6
    Tham gia ngày
    01 2010
    Bài gởi
    1
    Cảm ơn
    0
    Được cảm ơn 0 lần trong 0 bài viết

    Lọc danh sách

    Em cố tự làm nhưng tay nghề em yếu quá. mong các anh chị giúp em lấy ra 1 lần 50 tên nhé.Nhưng phải ngẫu nhiên và những lần như vậy không được trùng nhau nhé. em post lên file excel này mong các anh chị giúp đỡ em nhé, Em chân thành cám ơn
    thay đổi nội dung bởi: vkk77, 19-01-10 lúc 07:14 PM Lý do: chỉnh lại cho đúng

  9. #7
    Tham gia ngày
    11 2009
    Bài gởi
    22
    Cảm ơn
    0
    Được cảm ơn 24 lần trong 14 bài viết
    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
    1- Phải tạo một Object Dictionary
    2- Phải thêm bẫy lỗi: On Error Resume Next vì Dictionary.Add sẽ bị trùng Key do ngẫu nhiên

    Chúng ta có thể viết code cũng đơn giản thôi, dễ hiểu, không bẫy lỗi, không dùng Dic như sau:
    (code trên viết lại, một số biến thay đổi tên)
    Code:
    Function RandNum(Btom As Long, Top As Long, Amount As Long)
    ReDim aa(Amount) As Long
         Do
            bb = Int(Rnd() * (Top - Btom + 1)) + Btom
            If InStr(cc, "@" & bb & "@") = 0 Then
                aa(i) = bb
                cc = cc & "@" & bb & "@"
                i = i + 1
            End If
        Loop Until i = Amount
        RandNum = WorksheetFunction.Transpose(aa)
     End Function

  10. Có 2 thành viên cảm ơn ba3ba3 về bài viết này:


  11. #8
    Tham gia ngày
    06 2008
    Bài gởi
    23,550
    Cảm ơn
    13,516
    Được cảm ơn 41,931 lần trong 18,985 bài viết
    Trích Nguyên văn bởi ba3ba3 View Post
    1- Phải tạo một Object Dictionary
    2- Phải thêm bẫy lỗi: On Error Resume Next vì Dictionary.Add sẽ bị trùng Key do ngẫu nhiên

    Chúng ta có thể viết code cũng đơn giản thôi, dễ hiểu, không bẫy lỗi, không dùng Dic như sau:
    (code trên viết lại, một số biến thay đổi tên)
    Code:
    Function RandNum(Btom As Long, Top As Long, Amount As Long)
    ReDim aa(Amount) As Long
         Do
            bb = Int(Rnd() * (Top - Btom + 1)) + Btom
            If InStr(cc, "@" & bb & "@") = 0 Then
                aa(i) = bb
                cc = cc & "@" & bb & "@"
                i = i + 1
            End If
        Loop Until i = Amount
        RandNum = WorksheetFunction.Transpose(aa)
     End Function
    Hãy dùng code của bạn tạo ra 60000 số ngẫu nhiên trên bảng tính, từ 1 đến 100000 ---> Làm xong xem thử tốc độ code của bạn là bao nhiêu giây rồi hẳn bàn tiếp nhé
    (Tốc độ chạy code của "người ta" là < 1 giây đấy ---> Còn của bạn = ? )
    thay đổi nội dung bởi: ndu96081631, 15-10-10 lúc 08:12 AM

  12. Có 4 thành viên cảm ơn ndu96081631 về bài viết này:


  13. #9
    Tham gia ngày
    11 2009
    Bài gởi
    22
    Cảm ơn
    0
    Được cảm ơn 24 lần trong 14 bài viết
    Hãy dùng code của bạn tạo ra 60000 số ngẫu nhiên trên bảng tính, từ 1 đến 100000 ---> Làm xong xem thử tốc độ code của bạn là bao nhiêu giây rồi hẳn bàn tiếp nhé
    (Tốc độ chạy code của "người ta" là < 1 giây đấy ---> Còn của bạn = ? )
    1- Đúng là code của tôi chậm hơn do thao tác trên string với số lượng rất lớn, nhưng nó vẫn tốt khi tạo vài trăm số ngẫu nhiên.
    2- Sở dĩ tôi viết hàm trên vì tôi đã trích dẫn lý do: tác giả bảo "...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!", tôi chỉ chứng minh rằng ta vẫn có thể viết code gọn và dễ hiếu
    3- Mong GPE với tinh thần xây dựng là chính, các trao đổi nên dựa trên học thuật.
    * Ưu điểm của Dictionary là không có key trùng; dựa trên đấy tác giả anhtuan1066 viết function ngắn gọn; tuy nhiên việc bẫy lỗi "On Error Resume Next" về phương diện học thuật không phải ai cũng thích (mặc dù nhìn vào code, lỗi chỉ xẩy ra trong vòng lặp đã tiên liệu)
    * Ta có thể loại câu "On Error Resume Next" như sau:
    Code:
    Function RandNum2(Btom As Long, Top As Long, Amount As Long)
    Set aa = CreateObject("Scripting.Dictionary")
    1:  Do
            bb = Int(Rnd * (Top - Btom + 1)) + Btom
            If aa.Exists(bb) Then GoTo 1
            aa.Add bb
        Loop Until aa.Count = Amount
        RandNum2 = WorksheetFunction.Transpose(aa)
     End Function
    Xin ngừng ngang đây. cảm ơn các bạn đã góp ý

  14. Có 3 thành viên cảm ơn ba3ba3 về bài viết này:


  15. #10
    Tham gia ngày
    06 2008
    Bài gởi
    23,550
    Cảm ơn
    13,516
    Được cảm ơn 41,931 lần trong 18,985 bài viết
    Trích Nguyên văn bởi ba3ba3 View Post
    1- Đúng là code của tôi chậm hơn do thao tác trên string với số lượng rất lớn, nhưng nó vẫn tốt khi tạo vài trăm số ngẫu nhiên.
    2- Sở dĩ tôi viết hàm trên vì tôi đã trích dẫn lý do: tác giả bảo "...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!", tôi chỉ chứng minh rằng ta vẫn có thể viết code gọn và dễ hiếu
    3- Mong GPE với tinh thần xây dựng là chính, các trao đổi nên dựa trên học thuật.
    * Ưu điểm của Dictionary là không có key trùng; dựa trên đấy tác giả anhtuan1066 viết function ngắn gọn; tuy nhiên việc bẫy lỗi "On Error Resume Next" về phương diện học thuật không phải ai cũng thích (mặc dù nhìn vào code, lỗi chỉ xẩy ra trong vòng lặp đã tiên liệu)
    * Ta có thể loại câu "On Error Resume Next" như sau:
    Code:
    Function RandNum2(Btom As Long, Top As Long, Amount As Long)
    Set aa = CreateObject("Scripting.Dictionary")
    1:  Do
            bb = Int(Rnd * (Top - Btom + 1)) + Btom
            If aa.Exists(bb) Then GoTo 1
            aa.Add bb
        Loop Until aa.Count = Amount
        RandNum2 = WorksheetFunction.Transpose(aa)
     End Function
    Xin ngừng ngang đây. cảm ơn các bạn đã góp ý
    1> Không phải là CHẬM HƠN mà gọi là QUÁ QUÁ.. CHẬM mới đúng ----> Trong 1 chương trình hoàn chỉnh thường có nhiều module, và trong từng module người ta hơn thua nhau từng ms một (chứ tốc độ rùa thế thì.. không ăn thua)
    2> Dictionary Object là món chuyên về Unique rồi ---> Thiết nghĩ chẳng cần phải "cải biên" thêm làm gì ----> Chẳng ai lại đi bỏ cái "sở trường" mà đi dùng cái "sở đoản" cho mất công
    3> Cái vụ On Error Resume Next chẳng qua là "người ta" quá hiểu lỗi có thể xuất hiện ở đây là gì rồi ---> Nếu viết cho rõ thì vầy:
    PHP Code:
    Function UniqueRandomNum(Bottom As LongTop As LongAmount As Long)
      
    Dim Tmp as Long
      
    'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9
      
    If Amount Top Bottom 1 Then Amount Top Bottom 1
      With CreateObject
    ("Scripting.Dictionary")
        Do
          
    Tmp Int(Rnd() * (Top Bottom 1)) + Bottom
          
    If Not .Exists(Tmpthen .Add Tmp""
        
    Loop Until .Count Amount
        UniqueRandomNum 
    WorksheetFunction.Transpose(.Keys)
      
    End With
     End 
    Function 
    4> Xét về mặt "dễ hiểu" thì cũng không chắc code của bạn đã dễ hiểu hơn đâu (thuật toán dạng này đã từng có trên diễn đàn rồi)
    -----------------------------
    Bạn còn ý kiến gì khác hơn không? Tôi rất mong có thể học hỏi thêm những điều mới lạ (mà tôi chưa biết) từ bạn

  16. Có 6 thành viên cảm ơn ndu96081631 về bài viết này:


Trang 1/5 1 2 3 4 5 cuốicuối

Thông tin về chủ đề này

Users Browsing this Thread

Hiện có 1 người đang xem đề tài này. (0 thành viên và 1 khách)

Đề tài tương tự

  1. Tạo header & Footer nhiều lần khác nhau trong nhiều trang phải làm như thế nào?
    Viết bởi huatrungkien2512 trong chuyên mục Hỏi đáp những vấn đề khác
    Trả lời: 4
    Bài mới gởi: 29-10-13, 11:29 PM
  2. Hỏi cách Upload dữ liệu từ nhiều file .html,.txt,... vào nhiều sheets trong Excel VBA
    Viết bởi hoangtu1506 trong chuyên mục Excel 2007, 2010 & 2013
    Trả lời: 0
    Bài mới gởi: 11-08-10, 03:02 PM
  3. Xóa nhiều vùng khác nhau trong nhiều sheet
    Viết bởi trantuonganh2008 trong chuyên mục Hàm và công thức Excel
    Trả lời: 20
    Bài mới gởi: 19-07-10, 08:59 PM
  4. Công thức nào để chuyển định khoản nhiều nợ - nhiều có về 1 nợ nhiều có...
    Viết bởi vuha trong chuyên mục Cấu trúc dữ liệu Excel và việc Xử lý dữ liệu
    Trả lời: 4
    Bài mới gởi: 11-03-09, 09:08 AM
  5. Truy xuất dữ liệu trong nhiều Sheet hoặc nhiều Name?
    Viết bởi BNTT trong chuyên mục Cấu trúc dữ liệu Excel và việc Xử lý dữ liệu
    Trả lời: 4
    Bài mới gởi: 10-07-08, 03:22 PM

Bookmarks

Bookmarks

Quyền Sử Dụng Ở Diễn Ðàn

  • Bạn không thể đăng đề tài mới
  • Bạn không thể đăng trả lời
  • Bạn không thể đăng file đính kèm.
  • Bạn không thể sửa bài viết.
  •  

Mudim v0.8 Tắt VNI Telex Viqr Tổng hợp
Chính tả Bỏ dấu kiểu mới  [Bật/Tắt (F9)]