我做的是一个考试系统,取题目的步骤思想是这样的:在数据库取出所有问题和答案赋值给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了、
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了、
int[] txt = RadomNumber(txtcount, 3);
???
#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