C#生成不重复的随机数介绍_第1页
C#生成不重复的随机数介绍_第2页
C#生成不重复的随机数介绍_第3页
C#生成不重复的随机数介绍_第4页
C#生成不重复的随机数介绍_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C#生成不重复的随机数介绍我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复 随机数的题目,在.net Framework中提供了一个专门用来产生随机数的 类 System.Random。对于随机数,大家都知道,计算机不可能产生完全随机的数字,所 谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂 的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪 随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数 字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够 了。伪随机数的选 择是从随机种子开始的,所以为了保证每次得到的 伪随机数都足够地“随机

2、”,随机种子的选择就显得非常重要。如果随机 种子一样,那么同一个随机数发生器产生 的随机数也会一样。一般地, 我们使用同系统时间有关的参数作为随机种子,这也是.net Framework 中的随机数发生器默认采用的方法。我们可以使用两种方式初始化一个随机数发生器: 第一种方法不指定随机种子,系统自动选取当前时间作为随机种子 Random ro = new Random();第二种方法可以指定一个 int 型参数作为随机种子:int iSeed=10;Random ro = new Random(10);long tick = DateTime.Now.Ticks;Random ran = ne

3、w Random(int)(tick & 0 xffffffffL) | (int) (tick 32);这样可以保证 99%不是一样。之后,我们就可以使用这个Random类的对象来产生随机数,这时 候要用到RandomNext()方法。这个方法使用相当灵活,你甚至可以指 定产生的随机数的上下限。不指定上下限的使用如下:int iResult;iResult=roNext();下面的代码指定返回小于100的随机数:int iResult;int iUp=100;iResult=roNext(iUp);而下面这段代码则指定返回值必须在50-100 的范围之内:int iResult;int iU

4、p=100;int iDown=50;iResult=roNext(iDown,iUp);除了 Ran do mNext ()方法之外,Ran dom类还提供了Ran domN extDouble()方法产生一个范围在00-10之间的随机的双精 度浮点数:double dResult;dResult=ro.NextDouble();但是用Random类生成题号,会出现重复,特别是在数量较小的题 目中要生成不重复的的题目是很难的,参考了网上的一些方法,包括两 类,一类是通过随机种子入手,使每一次的随机种子不同,来保证不重 复;第二类是使用一些数据结构和算法。下面主要就第二类介绍几个方 法。方法

5、1:思想是用一个数组来保存索引号,先随机生成一个数组位置, 然后把这个位置的索引号取出来,并把最后一个索引号复制到当前的数 组位置,然后使随机 数的上限减一,具体如:先把这100 个数放在一 个数组内,每次随机取一个位置(第一次是 1-100,第二次是 1-99, .), 将该位置的数用最后的数代替。int index = new int15;for (int i = 0; i 15; i+)index = i;Random r = new Random();/用来保存随机生成的不重复的 10 个数int result = new int10;int site = 15;/设置下限int id

6、;for (int j = 0; j 10; j+)id = r.Next(1, site - 1); /在随机位置取出一个数,保存到结果数组 resultj = indexid;/最后一个数复制到当前位置indexid = indexsite - 1;/位置的下限减少一site-;方法 2 利用 Hashtable。NextPageHashtable hashtable = new Hashtable();Random rm = new Random();int RmNum = 10;for (int i = 0; hashtable.Count RmNum; i+)int nValue =

7、 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 int10;int tmp=0;int minValue=1;int maxValue=10;for (int i=0;i10;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=arrNum.Length-1)if (arrNumn=tmp) /利用循环判断是否有重复tm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论