小弟正学.net,做了一个网上考试系统,请高手看看我的程序出了什么毛病?这是从题库中提取一定数量的试题插入到试卷表中,为什么一次只能插入一个试题!插入多个就不行!我查了产生的随机数怎么都一样啊!该怎么改啊!如果要全程序的请请跟我说一声!请高手赐教!
 for(int j=0;j<Convert.ToInt32(TextBox9.Text);j++) //根据单选题量循环选题
{
int r1;
Random r  = new Random();
r1 = 1 + r.Next(1,biaocount);
for(int s = 0;s<objdatatabledxtkb.Rows.Count-1;s++)
{
if(r1 > Convert.ToInt32((objdatatabledxtkb.Rows[s][6])) && r1 < Convert.ToInt32((objdatatabledxtkb.Rows[s][7])))
{
SqlDataAdapter objadapterinsertdxtkb=new SqlDataAdapter();
string strsqlinsertdxtkb; //向库中插入单选题
strsqlinsertdxtkb = "insert into sj (sjid,stid,da,tg)" +"values('" + intsjid + "'," + "'" + objdatatabledxtkb.Rows[s][5] +"',"+"'"+objdatatabledxtkb.Rows[s][12]+"',"+"'"+objdatatabledxtkb.Rows[s][13] + "')";
SqlCommand objcommandinsertdxtkb = new SqlCommand(strsqlinsertdxtkb, myconnection);
objcommandinsertdxtkb.ExecuteNonQuery();
//break;
//Exit For;
}

}
}
//mydataset.Clear()
break;

解决方案 »

  1.   

    因为你没有指定随机因子。而系统每次产生随机数时,程序每次启动后产生的第一个、第二个都与上一次产生的第一个、第二个相同的。
    最好的办法是以系统时间为随机因子。下面是例子:
    计算机不可能产生完全随机的数字,ASP.NET中的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪随机数,Ststem.Random表示伪随机数生成器。    伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。    伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。一般地,我们使用同系统时间有关的参数作为随机种子,这也是 .net Framework 中的随机数发生器默认采用的方法。    一、初始化伪随机数发生器    我们可以采用系统时间为随机种子的方式来初始化伪随机数生成器,如:
        Random ro=new Random();
        或者
        Random ro=new Random(unchecked((int)DateTime.Now.Ticks));    也可以指定一个随机种子,如:
        Random ro=new Random(10);    二、产生需要的随机数    为了方便表述和演示,icech在这里直接在代码中说明产生各类随机数的方法:using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;namespace WebApplication1
    {
     /// <summary>
     /// WebForm1 的摘要说明。
     /// </summary>
     public class WebForm1 : System.Web.UI.Page
     {
      private void Page_Load(object sender, System.EventArgs e)
      {
       // 在此处放置用户代码以初始化页面
       // 初始化伪随机数发生器
       Random ro=new Random(unchecked((int)DateTime.Now.Ticks));   // 方法1:指定随机数上下限,产生上下限中的随机整数
       String RoInt=ro.Next(1,20).ToString();
       Response.Write("RoInt="+RoInt+"<br>");   // 方法2:返回系统时间作为随机种子的随机整数
       String RoInt2=ro.Next().ToString();
       Response.Write("RoInt2="+RoInt2+"<br>");   // 方法3:指定最大值非负随机整数
       String RoInt3=ro.Next(10).ToString();
       Response.Write("RoInt3="+RoInt3+"<br>");   // 方法4:生成0.0和1.0之间的随机数
       String RoDouble=ro.NextDouble().ToString();
       Response.Write("RoDouble="+RoDouble+"<br>");   // 方法5:用随机数填充指定字节数组
       // 字节数组的每个元素均设置为
       // 一个大于或等于零而小于或等于 MaxValue 的随机数
       // MaxValue = 255
       Byte[] b = new Byte[5];
       ro.NextBytes(b);
       for (int i = 0; i < 5; i++) 
       {
        Response.Write("RoBytes"+i+"=");  
        Response.Write(b[i]+"<br>");
       }  }  #region Web 窗体设计器生成的代码
      override protected void OnInit(EventArgs e)
      {
       //
       // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
       //
       InitializeComponent();
       base.OnInit(e);
      }
      
      /// <summary>
      /// 设计器支持所需的方法 - 不要使用代码编辑器修改
      /// 此方法的内容。
      /// </summary>
      private void InitializeComponent()
      {    
       this.Load += new System.EventHandler(this.Page_Load);
      }
      #endregion
     }
    }    三、产生随机数的结果    这里产生出一组随机数,大家参考一下他们的格式。 RoInt=13
     RoInt2=522075042
     RoInt3=2
     RoDouble=0.800674877036677
     RoBytes0=91
     RoBytes1=15
     RoBytes2=78
     RoBytes3=252
     RoBytes4=96    ASP.NET产生随机数的方法比较简单,方式和操作也很灵活。由于网络安全的因素,随机数越来越多的用在各类程序中,如登陆验证、注册验证等等。希望icech的这个学习笔记能给你一些帮助。
      

  2.   

    随即取题我觉得用数据库的功能来实现比较好(sql语句就行,sql server中select * from table order by newid()就随即排序了)