Tạo Câu hỏi ngẫu nhiên và các lựa chọn đáp án ngẫu nhiên?

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

thkd09

Thành viên mới
Tham gia
26/3/09
Bài viết
47
Được thích
2
Giới tính
Nam
Chào các bác!
Em đang làm một tiện ích trắc nghiệm, Em đã có 1 bảng dữ liệu gồm Câu hỏi và 4 sự lựa chọn đáp án.
Bây giờ em muốn:
1. Lấy ra 10 câu hỏi ngẫu nhiên trong bảng dữ liệu.
2. Các phương án trả lời cũng lấy ngẫu nhiên theo câu hỏi (tức là em muốn đổi vị trí các phương án trả lời)
Kính mong các bác hướng dẫn giúp em ạ. Em xin chân thành cảm ơn!
 

File đính kèm

  • TRON_CAU_HOI.xlsx
    35.7 KB · Đọc: 21
Chào các bác!
Em đang làm một tiện ích trắc nghiệm, Em đã có 1 bảng dữ liệu gồm Câu hỏi và 4 sự lựa chọn đáp án.
Bây giờ em muốn:
1. Lấy ra 10 câu hỏi ngẫu nhiên trong bảng dữ liệu.
2. Các phương án trả lời cũng lấy ngẫu nhiên theo câu hỏi (tức là em muốn đổi vị trí các phương án trả lời)
Kính mong các bác hướng dẫn giúp em ạ. Em xin chân thành cảm ơn!
.
Bạn làm tới đâu rồi? Thử đưa code lên xem sao.

Vè ngẫu nhiên, dễ nhất là dùng 1 cột phụ sử dụng hàm Rnd() rồi sort.

Data cùa bạn thiếu cột: "Đáp án đúng". Sau khi trộn chọn lựa ABCD, cột "Đáp án đúng" phải thay đổi theo.

Ví dụ câu hỏi gốc "Đáp án đúng" là 1. Sau khi trộn chọn lựa thành DCAB , thì "Đáp án đúng" thay đổi thành 3.

.
 
Upvote 0
.
Bạn làm tới đâu rồi? Thử đưa code lên xem sao.

Vè ngẫu nhiên, dễ nhất là dùng 1 cột phụ sử dụng hàm Rnd() rồi sort.

Data cùa bạn thiếu cột: "Đáp án đúng". Sau khi trộn chọn lựa ABCD, cột "Đáp án đúng" phải thay đổi theo.

Ví dụ câu hỏi gốc "Đáp án đúng" là 1. Sau khi trộn chọn lựa thành DCAB , thì "Đáp án đúng" thay đổi thành 3.

.
Em gửi bác nhé. Em lấy ngẫu nhiên được câu hỏi. Phần còn lại là đáp án và Đáp án đúng như bác nói nữa ạ.
 

File đính kèm

  • TRON_CAU_HOI.xlsm
    45.4 KB · Đọc: 19
Upvote 0
Ý tưởng ngẫu nhiên như hạch. Dạy kiểu tiết kiệm năng lượng động não này chết nhọc sinh hết.
Câu hỏi trắc nghiệm không thể bốc ngẫu nhiên một cách vô trách nhiệm như vậy được.
1. Thứ nhất: lỡ bốc ra một đống chỉ quy về vài bài học đầu tiên thì sao? kiểm nghiệm như vậy đâu có thấy được kiến thức học sinh?
2. Thứ hai: bài học có những chương liên quan với nhau, có những chương gần như độc lập. Người ra bài phải nghiên cứu kỹ về kiểm nghiệm trình độ học sinh.
3. Thứ ba: có những chương quan trọng thì phải đặt trọng lượng nặng hơn. Số câu hỏi được bốc ra ở phần quan trọng nhiều hơn các phàn khác.

Nhớ năm 1974, khi tổ chức Tú tài IBM, Bộ GD miền Nam lúc ấy phải qua bao nhiêu chuyên viên, thử nghiệm đủ thứ.

Gần 50 năm sau, kỹ thuật tiến triển mà kiến thức GD thụt lùi.
 
Upvote 0
Ý tưởng ngẫu nhiên như hạch. Dạy kiểu tiết kiệm năng lượng động não này chết nhọc sinh hết.
Câu hỏi trắc nghiệm không thể bốc ngẫu nhiên một cách vô trách nhiệm như vậy được.
1. Thứ nhất: lỡ bốc ra một đống chỉ quy về vài bài học đầu tiên thì sao? kiểm nghiệm như vậy đâu có thấy được kiến thức học sinh?
2. Thứ hai: bài học có những chương liên quan với nhau, có những chương gần như độc lập. Người ra bài phải nghiên cứu kỹ về kiểm nghiệm trình độ học sinh.
3. Thứ ba: có những chương quan trọng thì phải đặt trọng lượng nặng hơn. Số câu hỏi được bốc ra ở phần quan trọng nhiều hơn các phàn khác.

Nhớ năm 1974, khi tổ chức Tú tài IBM, Bộ GD miền Nam lúc ấy phải qua bao nhiêu chuyên viên, thử nghiệm đủ thứ.

Gần 50 năm sau, kỹ thuật tiến triển mà kiến thức GD thụt lùi.
Em chẳng phải giáo viên đâu bác ơi!
 
Upvote 0
Em gửi bác nhé. Em lấy ngẫu nhiên được câu hỏi. Phần còn lại là đáp án và Đáp án đúng như bác nói nữa ạ.
Bạn đang đảo lộn vị trí ngẫu nhiên của 10 câu hỏi đầu tiên, chứ không phải lấy 10 câu hỏi NGẪU NHIÊN từ ngân hàng "n" câu hỏi
 
Upvote 0
Bạn đang đảo lộn vị trí ngẫu nhiên của 10 câu hỏi đầu tiên, chứ không phải lấy 10 câu hỏi NGẪU NHIÊN từ ngân hàng "n" câu hỏi
Dạ. Em sau đó đã thấy vấn đề đó rồi và đã sửa được cái đó rồi bác ạ! Bây giờ chỉ mỗi cái đảo vị trí đáp án của mỗi câu hỏi thôi.
 
Upvote 0
:D :D :D:D ← → :D ← → :D ← → :D ← : → :D ← → :D ← ::D :D :D
 

File đính kèm

  • Ngẫu.rar
    41.3 KB · Đọc: 21
Upvote 0
Làm đại, sai bỏ nhé

Mã:
Option Explicit
Sub ngaunhien()
Dim lr&, i&, j&, k&, rng, r, arr(), res(), ary
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
Const ques = 10: ary = Array("A", "B", "C", "D")
ReDim arr(1 To ques, 1 To 1)
ReDim res(1 To ques * 7, 1 To 2)
Randomize
With Sheets("DATA")
    lr = .Cells(Rows.Count, "A").End(xlUp).Row
    rng = .Range("A3:F" & lr).Value
End With
Do
    j = j + 1
    Do
        r = Int(Rnd * UBound(rng)) + 1
        If Not dic.exists(r) Then
            dic.Add r, ""
            arr(j, 1) = r
            Exit Do
        End If
    Loop
Loop Until j >= ques
dic.RemoveAll
For i = 1 To UBound(arr)
    k = k + 1: j = 1: res(k, 2) = rng(arr(i, 1), 2)
    Do
        r = Int(Rnd * 4) + 1
        If Not dic.exists(r) Then
             dic.Add r, ""
             k = k + 1: j = j + 1
             res(k, 1) = ary(j - 2): res(k, 2) = rng(arr(i, 1), r + 2)
             If j >= 5 Then Exit Do
         End If
    Loop
    dic.RemoveAll
Next
With Sheets("MAIN")
    .Range("A2:B1000").ClearContents
    .Range("A2").Resize(UBound(res), 2).Value = res
End With
Set dic = Nothing
End Sub
 

File đính kèm

  • NgauNhien.xlsm
    45.1 KB · Đọc: 11
Upvote 0
Chào các bác!
Em đang làm một tiện ích trắc nghiệm, Em đã có 1 bảng dữ liệu gồm Câu hỏi và 4 sự lựa chọn đáp án.
Bây giờ em muốn:
1. Lấy ra 10 câu hỏi ngẫu nhiên trong bảng dữ liệu.
2. Các phương án trả lời cũng lấy ngẫu nhiên theo câu hỏi (tức là em muốn đổi vị trí các phương án trả lời)
Kính mong các bác hướng dẫn giúp em ạ. Em xin chân thành cảm ơn!
Chạy sub XYZ . .
Mã:
Sub XYZ()
  Dim arr(), a&(), b&(), res(), i&, j&
  Const SoCau& = 10
 
  Randomize
  arr = Sheets("DATA").Range("B3", Sheets("DATA").Range("F3").End(xlDown)).Value
  ReDim res(1 To SoCau, 1 To 5)
  Call TaoMangNgauNhien(a, UBound(arr))
  For i = 1 To SoCau
    res(i, 1) = arr(a(i), 1)
    Call TaoMangNgauNhien(b, 4)
    For j = 2 To 5
      res(i, j) = arr(a(i), b(j - 1) + 1)
    Next j
  Next i
    Sheets("MAIN").Range("A1").Resize(SoCau, 5) = res
End Sub

Sub TaoMangNgauNhien(aRnd, N)
  Dim i&, t&, r&
  ReDim aRnd(1 To N)
  For i = 1 To N
    r = Int(Rnd * N) + 1
    If aRnd(r) = 0 Then t = r Else t = aRnd(r)
    If aRnd(N) = 0 Then aRnd(r) = N Else aRnd(r) = aRnd(N)
    aRnd(N) = t
    N = N - 1
  Next i
End Sub
 
Upvote 0
1. Thứ nhất: lỡ bốc ra một đống chỉ quy về vài bài học đầu tiên thì sao? kiểm nghiệm như vậy đâu có thấy được kiến thức học sinh?
2. Thứ hai: bài học có những chương liên quan với nhau, có những chương gần như độc lập. Người ra bài phải nghiên cứu kỹ về kiểm nghiệm trình độ học sinh.
3. Thứ ba: có những chương quan trọng thì phải đặt trọng lượng nặng hơn. Số câu hỏi được bốc ra ở phần quan trọng nhiều hơn các phàn khác.
Theo ngu ý mình thì... Phân loại các câu trắc nghiệm theo 3 ý trên => có nghĩa là sẽ tạo ra "N" khối, và trong mỗi khối có "M" câu hỏi chung tính chất phân loại như 3 ý trên => và sau đó mới tiến hành bóc ngẫu nhiên với điều kiện là mỗi khối có ít nhất 1 câu (như thế kiến thức sẽ đều hết) ...
Không biết ngu như mình nghĩ thế có đúng không các bác nhở...
 
Upvote 0
. . . . . ..
Không biết ngu như mình nghĩ thế có đúng không các bác nhở...
Thứ nhất: Ý này khôn ra phết, ngu gì mà ngu;
Nhưng chủ bài đăng cho biết là không trong ngành các giáo chức
Nên mình đoán là trong lĩnh vực công thương nghiệp hay đoàn thể gì đó!
 
Upvote 0
Thứ nhất: Ý này khôn ra phết, ngu gì mà ngu;
Nhưng chủ bài đăng cho biết là không trong ngành các giáo chức
Nên mình đoán là trong lĩnh vực công thương nghiệp hay đoàn thể gì đó!
Ối bác Sa ơi... còn bầu rượu kế bên mình không thế?... hehehe
 
Upvote 0
Theo ngu ý mình thì... Phân loại các câu trắc nghiệm theo 3 ý trên => có nghĩa là sẽ tạo ra "N" khối, và trong mỗi khối có "M" câu hỏi chung tính chất phân loại như 3 ý trên => và sau đó mới tiến hành bóc ngẫu nhiên với điều kiện là mỗi khối có ít nhất 1 câu (như thế kiến thức sẽ đều hết) ...
Không biết ngu như mình nghĩ thế có đúng không các bác nhở...
Chuyện giáo dục là chuyện con người đối với con người, đâu thể máy móc được. Dẫu có muốn tiết kiệm công sức bằng cách tự động thì cũng tính toán tự động cho nó có cá tính con người.
Vì vậy bài thi phải được tính toán trước. Nếu cần "chia vùng" câu hỏi thì phải chia thôi. Chuyện này phải có kinh nghiệm. Nhwg nếu chỉ a thần phù một cái code VBA làm tự động thì học kinh nghiệm ở chỗ nào?

Đầu tiên hết, chọn câu là một chuyện, trình bày là chuyện khác.
Bài thi nên trình bày theo kiểu nào?
1. Kiểu từ dễ đến khó? thích hợp với các môn không quan trọng lắm, thí sinh làm hết các câu dễ rồi mới qua các câu khó để phân hạng.
2. Kiểu thứ tự theo chương trình học? kiểu này thích hợp cho các môn khá quan trọng. Nó có lahr năng phân tích trình độ hiểu biết của thí sinh khá sát.
3. Kiểu câu ngắn trước, câu dài sau? cũng gần như kiểu 1, nhiều thí sinh tuy giỏi nhưng tốc độ đọc ủa họ không nhanh bằng người khác, bắt hộ đọc các câu dài trước nhiều khi làm cho hộ mất thời gian, không làm kịp bài. (có một số người bị bệnh giống như tôi, không nhận mặt chữ nhanh được. Đây là loại bệnh y lý bẩm sinh đàng hoàng, tôi không đùa)
 
Upvote 0
Chạy sub XYZ . .
Mã:
Sub XYZ()
  Dim arr(), a&(), b&(), res(), i&, j&
  Const SoCau& = 10
 
  Randomize
  arr = Sheets("DATA").Range("B3", Sheets("DATA").Range("F3").End(xlDown)).Value
  ReDim res(1 To SoCau, 1 To 5)
  Call TaoMangNgauNhien(a, UBound(arr))
  For i = 1 To SoCau
    res(i, 1) = arr(a(i), 1)
    Call TaoMangNgauNhien(b, 4)
    For j = 2 To 5
      res(i, j) = arr(a(i), b(j - 1) + 1)
    Next j
  Next i
    Sheets("MAIN").Range("A1").Resize(SoCau, 5) = res
End Sub

Sub TaoMangNgauNhien(aRnd, N)
  Dim i&, t&, r&
  ReDim aRnd(1 To N)
  For i = 1 To N
    r = Int(Rnd * N) + 1
    If aRnd(r) = 0 Then t = r Else t = aRnd(r)
    If aRnd(N) = 0 Then aRnd(r) = N Else aRnd(r) = aRnd(N)
    aRnd(N) = t
    N = N - 1
  Next i
End Sub
Em chân thành cảm ơn bác nhiều!
 
Upvote 0
Chạy sub XYZ . .
Mã:
Sub XYZ()
  Dim arr(), a&(), b&(), res(), i&, j&
  Const SoCau& = 10
 
  Randomize
  arr = Sheets("DATA").Range("B3", Sheets("DATA").Range("F3").End(xlDown)).Value
  ReDim res(1 To SoCau, 1 To 5)
  Call TaoMangNgauNhien(a, UBound(arr))
  For i = 1 To SoCau
    res(i, 1) = arr(a(i), 1)
    Call TaoMangNgauNhien(b, 4)
    For j = 2 To 5
      res(i, j) = arr(a(i), b(j - 1) + 1)
    Next j
  Next i
    Sheets("MAIN").Range("A1").Resize(SoCau, 5) = res
End Sub

Sub TaoMangNgauNhien(aRnd, N)
  Dim i&, t&, r&
  ReDim aRnd(1 To N)
  For i = 1 To N
    r = Int(Rnd * N) + 1
    If aRnd(r) = 0 Then t = r Else t = aRnd(r)
    If aRnd(N) = 0 Then aRnd(r) = N Else aRnd(r) = aRnd(N)
    aRnd(N) = t
    N = N - 1
  Next i
End Sub
Em nhờ anh giúp em xuất dữ liệu theo file đính kèm. Em mày mò code của anh mà không lấy được đúng theo ý mình. Em cảm ơn!
 

File đính kèm

  • ASK_GPE.xlsm
    43.1 KB · Đọc: 8
Upvote 0
Web KT

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

Back
Top Bottom