知识大全 用C#生成不重复的随机数

Posted 种子

篇首语:一箫一剑平生意,负尽狂名十五年。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用C#生成不重复的随机数相关的知识,希望对你有一定的参考价值。

用C#生成不重复的随机数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  我们在做能自动生成试卷的考试系统时 常常需要随机生成一组不重复的题目 在 net Framework中提供了一个专门用来产生随机数的类System Random

  对于随机数 大家都知道 计算机不可能产生完全随机的数字 所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算 用产生的结果来近似的模拟完全随机数 这种随机数被称作伪随机数 伪随机数是以相同的概率从一组有限的数字中选取的 所选数字并不具有完全的随机性 但是从实用的角度而言 其随机程度已足够了 伪随机数的选择是从随机种子开始的 所以为了保证每次得到的伪随机数都足够地 随机 随机种子的选择就显得非常重要 如果随机种子一样 那么同一个随机数发生器产生的随机数也会一样 一般地 我们使用同系统时间有关的参数作为随机种子 这也是 net Framework中的随机数发生器默认采用的方法

  我们可以使用两种方式初始化一个随机数发生器

  第一种方法不指定随机种子 系统自动选取当前时间作为随机种子

  Random ro = new Random();

  第二种方法可以指定一个int型参数作为随机种子

  int iSeed= ;  Random ro = new Random( );  long tick = DateTime Now Ticks;  Random ran = new Random((int)(tick & xffffffffL) | (int) (tick >> ));

  这样可以保证 %不是一样

  之后 我们就可以使用这个Random类的对象来产生随机数 这时候要用到Random Next()方法 这个方法使用相当灵活 你甚至可以指定产生的随机数的上下限

  不指定上下限的使用如下

  int iResult;  iResult=ro Next();

  下面的代码指定返回小于 的随机数

  int iResult;  int iUp= ;  iResult=ro Next(iUp);

  而下面这段代码则指定返回值必须在 的范围之内

  int iResult;  int iUp= ;  int iDown= ;  iResult=ro Next(iDown iUp);

  除了Random Next()方法之外 Random类还提供了Random NextDouble()方法产生一个范围在 之间的随机的双精度浮点数

  double dResult;  dResult=ro NextDouble();

  但是用Random类生成题号 会出现重复 特别是在数量较小的题目中要生成不重复的的题目是很难的 参考了网上的一些方法 包括两类 一类是通过随机种子入手 使每一次的随机种子不同 来保证不重复;第二类是使用一些数据结构和算法 下面主要就第二类介绍几个方法

  方法 思想是用一个数组来保存索引号 先随机生成一个数组位置 然后把这个位置的索引号取出来 并把最后一个索引号复制到当前的数组位置 然后使随机数的上限减一 具体如 先把这 个数放在一个数组内 每次随机取一个位置(第一次是 第二次是 ) 将该位置的数用最后的数代替

  int[] index = new int[ ];  for (int i = ; i < ; i++)  index = i;  Random r = new Random();  //用来保存随机生成的不重复的 个数  int[] result = new int[ ];  int site = ;//设置下限  int id;  for (int j = ; j < ; j++)     id = r Next( site );   //在随机位置取出一个数 保存到结果数组   result[j] = index[id];   //最后一个数复制到当前位置   index[id] = index[site ];   //位置的下限减少一   site ;    方法 利用Hashtable [NextPage]  Hashtable hashtable = new Hashtable();  Random rm = new Random();  int RmNum = ;  for (int i = ; hashtable Count < RmNum; i++)     int nValue = rm Next( );   if (!hashtable ContainsValue(nValue) && nValue != )       hashtable Add(nValue nValue);    Console WriteLine(nValue ToString());     

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

cha138/Article/program/net/201311/15682

相关参考