我做的是一个考试系统,取题目的步骤思想是这样的:在数据库取出所有问题和答案赋值给dataset然后根据题目类型来随机抽3个错误答案。上代码:
    ds = commc.PRO_EXEC_String("select * from questionview ");
        ds1 = commc.PRO_EXEC_String("select * from pic_x_answer");
        ds2 = commc.PRO_EXEC_String("select * from txt_x_answer");
        int rowcount = ds.Tables[0].Rows.Count;   //取得正确答案的行数
        int piccount = ds1.Tables[0].Rows.Count;
        int txtcount = ds2.Tables[0].Rows.Count;
        randonum= RadomNumber(rowcount, 50);  //取得随机数组 0-49,50个不重复的随机数
        Binddatagrid(randonum, ds, gridview1);//获得所有正确答案的数据
        for (int i = 1; i < 51; i++)
        {
            this.DropDownList1.Items.Add(new ListItem(i.ToString(),randonum[i-1].ToString())); //保存题目个数和题目的索引
            
        }
        Random rad = new Random();
        string str = this.Hidden1.Value.ToString();
       
        ///按题目类型获得相应的错误答案
        for (int j = 0; j < 50; j++)
        {
            int[] pic = RadomNumber(piccount, 3);
            int[] txt = RadomNumber(txtcount, 3);
            loc = rad.Next(1, 4);
            str = str + "|" + loc.ToString();  //储存正确答案选择项1,2,3,4代表a,b,c,d
            if (this.gridview1.Rows[j].Cells[3].Text.ToString() == "图片题")
            {   
                for (int i = 0; i <=2;i++)
                {
                  
                    int picc = pic[i];
                    DataRow row = dt.NewRow();
                    row["A_Content"]=ds1.Tables[0].Rows[picc]["A_Content"].ToString();
                    row["A_True"]=ds1.Tables[0].Rows[picc]["A_True"].ToString();
                    row["ready03"] = ds1.Tables[0].Rows[picc]["ready03"].ToString();
                    row["A_Type"] = ds1.Tables[0].Rows[picc]["A_Type"].ToString();
                   
                    dt.Rows.Add(row);
                    dt.AcceptChanges();
                   
                }
            }
            if (this.gridview1.Rows[j].Cells[3].Text.ToString() == "文字题")
            {
                
                for (int i = 0; i <= 2; i++)
                {
                    int txtt = txt[i];
                    DataRow row = dt.NewRow();
                    row["A_Content"] = ds2.Tables[0].Rows[txtt]["A_Content"].ToString();
                    row["A_True"] = ds2.Tables[0].Rows[txtt]["A_True"].ToString();
                    row["ready03"] = ds2.Tables[0].Rows[txtt]["ready03"].ToString();
                    row["A_Type"] = ds2.Tables[0].Rows[txtt]["A_type"].ToString();
                    dt.Rows.Add(row);
                    dt.AcceptChanges();
                }
            }
            
          
        }
     
        this.Hidden1.Value = str;
        this.GridView2.DataSource = dt;
        this.GridView2.DataBind();现在输出结果是错误答案的数量对了,类型对了,但是同样3条数据,比如说第一个图片题抽取的答案id分别为1,2,3,4
而第二个图片题也是抽取相同的id了、

解决方案 »

  1.   

                int[] pic = RadomNumber(piccount, 3);
                int[] txt = RadomNumber(txtcount, 3);
    ???
      

  2.   


      #region 生成随机不重复数组
        protected int[] RadomNumber(int maxlength, int wantlength)
        {        int[] index = new int[maxlength];  //0-i的连续数组
            int[] result = new int[wantlength];  //结果输出的数组
            int size = maxlength;                   //连续数组的索引
            Random rad = new Random();     //随机变量
            for (int j = 0; j < maxlength; j++)
            {
                index[j] = j;  //给连续数组赋值
            }
            for (int k = 0; k < wantlength; k++)
            {
                int x = rad.Next(0, size);  //x=0-i之间的随机数
                result[k] = index[x];  //把第x个数字赋值给输出数组的第k个
                index[x] = index[size - 1]; //把最后一个数字覆盖掉第x个数字
                size--; //size减一        }
            return result;    }
        #endregion