用C#生成不重复的随机数 – asp.net 教程

我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.net framework中提供了一个专门用来产生随机数的类system.random。
  对于随机数,大家都知道,计算机不 可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称 作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。伪随机数的选 择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生 的随机数也会一样。一般地,我们使用同系统时间有关的参数作为随机种子,这也是.net framework中的随机数发生器默认采用的方法。
  我们可以使用两种方式初始化一个随机数发生器:
  第一种方法不指定随机种子,系统自动选取当前时间作为随机种子:
  random ro = new random();
  第二种方法可以指定一个int型参数作为随机种子:
  int iseed=10;
  random ro = new random(10);
  long tick = datetime.now.ticks;
  random ran = new random((int)(tick & 0xffffffffl) | (int) (tick >> 32));
  这样可以保证99%不是一样。
  之后,我们就可以使用这个random类的对象来产生随机数,这时候要用到random.next()方法。这个方法使用相当灵活,你甚至可以指定产生的随机数的上下限。
  不指定上下限的使用如下:
  int iresult;
  iresult=ro.next();
  下面的代码指定返回小于100的随机数:
  int iresult;
  int iup=100;
  iresult=ro.next(iup);
  而下面这段代码则指定返回值必须在50-100的范围之内:
  int iresult;
  int iup=100;
  int idown=50;
  iresult=ro.next(idown,iup);
  除了random.next()方法之外,random类还提供了random.nextdouble()方法产生一个范围在0.0-1.0之间的随机的双精度浮点数:
  double dresult;
  dresult=ro.nextdouble();
  但是用random类生成题号,会出现重复,特别是在数量较小的题目中要生成不重复的的题目是很难的,参考了网上的一些方法,包括两类,一类是通过随机种子入手,使每一次的随机种子不同,来保证不重复;第二类是使用一些数据结构和算法。下面主要就第二类介绍几个方法。
   
方法1:思想是用一个数组来保存索引号,先随机生成一个数组位置,然后把这个位置的索引号取出来,并把最后一个索引号复制到当前的数组位置,然后使随机 数的上限减一,具体如:先把这100个数放在一个数组内,每次随机取一个位置(第一次是1-100,第二次是1-99,…),将该位置的数用最后的数 代替。

  int[] index = new int[15];
  for (int i = 0; i     index = i;
  Random r = new Random();
  //用来保存随机生成的不重复的10个数
  int[] result = new int[10];
  int site = 15;//设置下限
  int id;
  for (int j = 0; j   {
    id = r.Next(1, site – 1);
    //在随机位置取出一个数,保存到结果数组
    result[j] = index[id];
    //最后一个数复制到当前位置
    index[id] = index[site – 1];
    //位置的下限减少一
    site–;
  }    

  方法2:利用Hashtable。[NextPage]

  Hashtable hashtable = new Hashtable();
  Random rm = new Random();
  int RmNum = 10;
  for (int i = 0; hashtable.Count   {
   int nValue = rm.Next(100);
   if (!hashtable.ContainsValue(nValue) && nValue != 0)
   {
   hashtable.Add(nValue, nValue);
   Console.WriteLine(nValue.ToString());
   }
  }    

  方法3:递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取。

 Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
  int[] arrNum=new int[10];
  int tmp=0;
  int minValue=1;
  int maxValue=10;
  for (int i=0;i  {
    tmp=ra.Next(minValue,maxValue); //随机取数
    arrNum=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值赋到数组中
  }
  ………
  ………
  public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra)
  {
    int n=0;
    while (n    {
      if (arrNum[n]==tmp) //利用循环判断是否有重复
      {
        tmp=ra.Next(minValue,maxValue); //重新随机获取。
        getNum(arrNum,tmp,minValue,maxValue,ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。
      }
    n++;
    }
    return tmp;
  }    

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2553876.html

(0)
上一篇 2025年3月6日 06:51:28
下一篇 2025年3月6日 06:51:35

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 构造函数不能为虚函数

    构造函数不能声明为虚函数的原因:     1,所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是先构造父类对象,然后才能使子类对象,如果构造函数设为虚函数,那么你在构造父类的构造函数时就不得不显式的调用构造,还有一个原因就是为了防…

    编程技术 2025年3月6日
    000
  • c#.net常用的小函数和方法集

    1、datetime数字型system.datetime currenttime=new system.datetime();1.1取当前年月日时分秒currenttime=system.datetime.now;1.2取当前年int年=c…

    编程技术 2025年3月6日
    200
  • ADO.NET调用存储过程

    一: 执行不带返回参数(input)的存储过程1: 首先在数据库写个存储过程, 如创建个 adduser存储过程。create proc adduser@id int,@name varchar(20),@sex varchar(20)as…

    编程技术 2025年3月6日
    200
  • asp.net下检测SQL注入式攻击代码

    两个类:(页面数据校验类)pagevalidate.cs基本通用。代码如下: 使用系统; 使用System.Text; 使用的System.Web; 使用System.Web.UI.WebControls; 使用System.Text.Re…

    编程技术 2025年3月6日
    200
  • C#学习之Reflection

    1、什么是反射: reflection,中文翻译为反射。 这是.net中获取运行时类型信息的方式 ,.net的应用程序由几个部分: ‘程序集(assembly)’、‘模块(module)’、‘类型(class)’组成,而反射提供一种编程的方…

    编程技术 2025年3月6日
    200
  • .NET 中的三种接口实现方式

    一般来说.net提供了三种不同的接口实现方式,分别为隐式接口实现、显式接口实现、混合式接口实现。这三种方式各有各的特点。 首先来看隐式接口实现,这恐怕是我们使用最多的一种接口实现,因为隐匿接口实现是.NET的默认接口实现方式。下面让我们来看…

    编程技术 2025年3月6日
    200
  • C#难点逐个击破(9):类型转换

    显式转换与隐式转换  类型之间的转换可以分为隐式转换与显式转换,如int类型可直接转换为long类型。  /*隐式转换*/ int intNum = 23; long longNum1 = intNum; 登录后复制 也可进行显式转换;  …

    编程技术 2025年3月6日
    200
  • 【c#教程】C# 不安全代码

    C# 不安全代码 当一个代码块使用 unsafe 修饰符标记时,c# 允许在函数中使用指针变量。不安全代码或非托管代码是指使用了指针变量的代码块。 指针变量 指针 是值为另一个变量的地址的变量,即,内存位置的直接地址。就像其他变量或常量,您…

    编程技术 2025年3月6日
    200
  • 【c#教程】C# 集合(Collection)

    C# 集合(Collection) 集合(collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。 集合…

    编程技术 2025年3月6日
    100
  • 【c#教程】C# 事件(Event)

    C# 事件(Event) 事件(event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。事件是用于进程间通信。 通过事件使用委托 事件在类中声明且生成…

    编程技术 2025年3月6日
    200

发表回复

登录后才能评论