2015-06-15 2 views
-3

Я создал систему в visual studio, используя asp.net (C#), где вопросы берутся из базы данных и отображаются пользователям.Случайные вопросы продолжают повторяться

но вопросы повторяются, и я не могу понять, что с ним не так, и некоторые вопросы не отображаются.

ниже соответствующий C# код для его

public partial class Computertest : System.Web.UI.Page 
{ 
    public static SqlConnection sqlconn; 
    protected string PostBackStr; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     SqlConnection con = new SqlConnection(); 
     con.ConnectionString = "Data Source=SHAHBAAZ-PC;Initial Catalog=project;User ID=sa;Password=pass;"; 
     PostBackStr = Page.ClientScript.GetPostBackEventReference(this, "time"); 
     if (IsPostBack) 
     { 
      string eventArg = Request["__EVENTARGUMENT"]; 
      if (eventArg == "time") 
      { 
       getNextQuestion(); 
      } 
     } 
    } 
    protected void Button1_Click(object sender, EventArgs e) 
    { 

     Label1.Visible = false; 
     txtName.Visible = false; 
     Button1.Visible = false; 
     Panel1.Visible = true; 
     lblName.Text = "Name : " + txtName.Text; 
     int score = Convert.ToInt32(txtScore.Text); 
     lblScore.Text = "Score : " + Convert.ToString(score); 
     Session["counter"] = "1"; 
     Random rnd = new Random(); 
     int i = rnd.Next(1, 6);//Here specify your starting slno of question table and ending no. 
     //lblQuestion.Text = i.ToString(); 
     getQuestion(i); 

    } 
    protected void Button2_Click(object sender, EventArgs e) 
    { 
     getNextQuestion(); 

    } 
    public void getQuestion(int no) 
    { 
     SqlConnection con = new SqlConnection(); 
     con.ConnectionString = "Data Source=SHAHBAAZ-PC;Initial Catalog=project;User ID=sa;Password=pass;"; 
     string str = "select * from ComputerQuestion where slNo=" + no + ""; 
     SqlDataAdapter da2 = new SqlDataAdapter(str, con); 
     DataSet ds2 = new DataSet(); 
     da2.Fill(ds2, "Question"); 
     if (ds2.Tables[0].Rows.Count > 0) 
     { 
      DataRow dtr; 
      int i = 0; 
      while (i < ds2.Tables[0].Rows.Count) 
      { 
       dtr = ds2.Tables[0].Rows[i]; 
       Session["Answer"] = Convert.ToString(Convert.ToInt32(dtr["Correct"].ToString()) - 1); 
       lblQuestion.Text = "Q." + Session["counter"].ToString() + " " + dtr["Question"].ToString(); 
       RblOption.ClearSelection(); 
       RblOption.Items.Clear(); 
       RblOption.Items.Add(dtr["Option1"].ToString()); 
       RblOption.Items.Add(dtr["Option2"].ToString()); 
       RblOption.Items.Add(dtr["Option3"].ToString()); 
       RblOption.Items.Add(dtr["Option4"].ToString()); 
       i++; 
      } 
     } 
    } 
    public void getNextQuestion() 
    { 
     if (Convert.ToInt32(Session["counter"].ToString()) < 6)//10 is a counter which is used for 10 questions 
     { 
      if (RblOption.SelectedIndex >= 0) 
      { 
       if (Session["Answer"].ToString() == RblOption.SelectedIndex.ToString()) 
       { 
        int score = Convert.ToInt32(txtScore.Text) + 1;// 1 for mark for each question 
        txtScore.Text = score.ToString(); 
        lblScore.Text = "Score : " + Convert.ToString(score); 
       } 
      } 

      Random rnd = new Random(); 
      int i = rnd.Next(1, 5); 
      //lblQuestion.Text = i.ToString(); 
      getQuestion(i); 
      Session["counter"] = Convert.ToString(Convert.ToInt32(Session["counter"].ToString()) + 1); 

     } 
     else 
     { 
      Panel2.Visible = true; 

     } 
    } 

Любая помощь будет оценена много.

+1

Добро пожаловать в StackOverflow! Просьба представить ваш код как [короткий, но полный пример] (http://stackoverflow.com/help/mcve), который включен в вопрос вместо ссылки pastebin (вы можете использовать ссылку «Изменить» под своим вопросом для что). Это значительно увеличит вероятность того, что люди будут смотреть на вашу проблему и помочь вам. – Heinzi

+0

_ "ниже - весь код C#" - показать соответствующую его часть здесь. – CodeCaster

+0

Уважаемые кодеры, Проблема в том, что я не получаю никаких ошибок, и я не могу понять, что не так с кодом. – user3184290

ответ

0

Привет здесь проблема с вашей случайной функцией. Если вы хотите, чтобы один вопрос повторился только после того, как все вопросы были показаны по крайней мере один.

Шаг 1: Сохраните массив с длиной, равной числу вопросов.

Шаг 2: Получите случайный вопрос.

Шаг 3: Проверьте, присутствует ли его идентификатор в массиве.

 If not present 
     add it to arrayand show the questions 
     else 
     get next random question repeat the check 

шаг 3: перед добавлением элемента для проверки массива

if array full make array empty and add new question ID 

Повторите весь шаги

+1

@ user3184290 Так что в основном не было никакой реальной проблемы с * кодом * как таковым, это было с ожиданием о том, что означает слово «случайный». –

+0

Да, код работает нормально. он просто слился со случайной функцией – Lijo

0

Речь идет о создании нового объекта Random каждый раз. У вас должен быть один экземпляр, который вы вызываете Next каждый раз.

Это связано с тем, как это реализовано, и тем фактом, что его семена с часового времени.

См Джон Skeets статью здесь хорошее объяснение и предложения о том, как решить это: http://csharpindepth.com/Articles/Chapter12/Random.aspx

Кажется, вы можете только 6 вопросов, так что будет меньше возможности повторять вопросы, если у Вас есть больше вопросы на выбор! Также во втором вызове вы выбираете только вопросы с 1 по 5, что полностью исключает вопрос 6, если он не был выбран в первый раз.

Решение:

Как это в настоящее время работает не исключает каких-либо уже выбранные вопросы выбраны снова, так что решение, которое я хотел бы использовать, чтобы получить все (или подмножество) вопросов, затем перетасовать их.

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

+1

Это не похоже на hotpath в цикле, хотя я тоже думал, что это была вероятная причина, но, судя по тому, где построены значения «Случайные», нет циклов, окружающих этот код. У вас есть это при нажатии кнопки и в 'getNextQuestion', который также не вызывается из цикла. –

+0

Он не находится в плотной петле, но по-прежнему может быть затронута той же причиной. Вы пытались использовать только один случайный экземпляр, чтобы убедиться, что он имеет какой-либо эффект? – w69rdy

+0

@ w69rdy просто попробовал, но все тот же. – user3184290

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