2014-12-24 2 views
-1

Я озадачен логикой перетасовки вопросов, которые я покажу из своей базы данных. В моем текущем коде отображаются случайные вопросы в текстовое поле, но также отображаются пустые и повторяющиеся записи.случайные и случайные вопросы vb

Dim r As MySqlDataReader 
    Dim i As Integer = 0 
    Dim temp() As Integer = {} 


    Dim txtQ() As TextBox = {txtQ1, txtQ2, txtQ3, txtQ4, txtQ5, txtQ6, txtQ7, txtQ8, txtQ9, txtQ10} 
    Dim cbA() As CheckedListBox = {cbA1, cbA2, cbA3, cbA4, cbA5, cbA6, cbA7, cbA8, cbA9, cbA10} 

    con.Open() 
    cmd = New MySqlCommand("select * from tbexam", con) 
    r = cmd.ExecuteReader 


    While r.Read 
     If i <= 9 Then 
      Randomize() 
      Dim j As Integer = CInt(Int(9 * Rnd())) 

      txtQ(j).Text = r.GetString("exam_question") 
      cbA(j).Items.Clear() 
      cbA(j).Items.Add("a) " & r.GetString("exam_ans_a")) 
      cbA(j).Items.Add("b) " & r.GetString("exam_ans_b")) 
      cbA(j).Items.Add("c) " & r.GetString("exam_ans_c")) 
      cbA(j).Items.Add("d) " & r.GetString("exam_ans_d")) 


      i = i + 1 
     End If 
    End While 

ответ

1

Когда вы помещаете случайное число в j, это (очень близко) случайное число между 0 и 9. Это эквивалентно прокатке десятигранных кубиков. Как вы думаете, каковы шансы, что если вы будете откатывать его десять раз, вы получите ровно одно из значений от 0 до 9? Довольно низко. Фактически вы получите что-то вроде: 2, 0, 8, 2, 5, 1, 7, 6, 1, 4. Эта последовательность содержит дубликаты 2 и 1, а значения 3 и 9 не отображаются. Вот откуда берутся ваши дубликаты и пробелы.

Один из вариантов, который вы могли бы попробовать - это заполнить массив последовательно, а затем перетасовать его.

Dim r As MySqlDataReader 
Dim i As Integer = 0 
Dim temp() As Integer = {} 

Dim txtQ() As TextBox = {txtQ1, txtQ2, txtQ3, txtQ4, txtQ5, txtQ6, txtQ7, txtQ8, txtQ9, txtQ10} 
Dim cbA() As CheckedListBox = {cbA1, cbA2, cbA3, cbA4, cbA5, cbA6, cbA7, cbA8, cbA9, cbA10} 

con.Open() 
cmd = New MySqlCommand("select * from tbexam", con) 
r = cmd.ExecuteReader 

' Read the Q&As into the arrays in the order they appear in the DB 
While r.Read 
    If i <= 9 Then 
     txtQ(i).Text = r.GetString("exam_question") 
     cbA(i).Items.Clear() 
     cbA(i).Items.Add("a) " & r.GetString("exam_ans_a")) 
     cbA(i).Items.Add("b) " & r.GetString("exam_ans_b")) 
     cbA(i).Items.Add("c) " & r.GetString("exam_ans_c")) 
     cbA(i).Items.Add("d) " & r.GetString("exam_ans_d")) 
     i = i + 1 
    End If 
End While 

' Re-order the arrays by swapping each element with another, randomly selected element. 
' Start with i at the count of the elements read in the last loop and work down. 
Dim n as Integer = i - 1 
While i > 0 
    Dim j As Integer = CInt(Int(n * Rnd())) 
    i = i - 1 
    ' Swap elements i and j of the arrays 
    Dim tmpQ As TextBox = txtQ(i) 
    txtQ(i) = txtQ(j) 
    txtQ(j) = tmpQ 
    Dim tmpA() As CheckedListBox = cbA(i) 
    cbA(i) = cbA(j) 
    cbA(j) = tmpA 
End While 

Это может быть упрощено и абстрагировано, но вы получите эту идею.

+0

этот код был полезным, но Мне нужно изменить tmpQ из текстового поля в строку – AJNovice

0

Трудно избежать повторной записи с использованием случайного числа, но вы можете избежать пустых записей. Вы получаете пустые записи, потому что вы генерируете случайное число и выбираете вопрос с этим идентификатором, и, к сожалению, этот идентификатор всегда недоступен в базе данных. Сначала сначала выберите все идентификаторы из базы данных в массиве и сформируйте случайное число от 0 до длины массива. и выберите значение id массива.

Смежные вопросы