`
isiqi
  • 浏览: 16830217 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

如何用C#生成不重复的随机数

阅读更多

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


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

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


  方法2:利用Hashtable。[NextPage]

  Hashtablehashtable=newHashtable();
  Randomrm=newRandom();
  intRmNum=10;
  for(inti=0;hashtable.Count<RmNum;i++)
  {
  intnValue=rm.Next(100);
  if(!hashtable.ContainsValue(nValue)&&nValue!=0)
  {
  hashtable.Add(nValue,nValue);
  Console.WriteLine(nValue.ToString());
  }
  }


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

 Randomra=newRandom(unchecked((int)DateTime.Now.Ticks));
  int[]arrNum=newint[10];
  inttmp=0;
  intminValue=1;
  intmaxValue=10;
  for(inti=0;i<10;i++)
  {
    tmp=ra.Next(minValue,maxValue);//随机取数
    arrNum=getNum(arrNum,tmp,minValue,maxValue,ra);//取出值赋到数组中
  }
  .........
  .........
  publicintgetNum(int[]arrNum,inttmp,intminValue,intmaxValue,Randomra)
  {
    intn=0;
    while(n<=arrNum.Length-1)
    {
      if(arrNum[n]==tmp)//利用循环判断是否有重复
      {
        tmp=ra.Next(minValue,maxValue);//重新随机获取。
        getNum(arrNum,tmp,minValue,maxValue,ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。
      }
    n++;
    }
    returntmp;
  }

 

分享到:
评论

相关推荐

    C#生成不重复字母数字组合的随机数

    总结,C#生成不重复字母数字组合的随机数涉及到`Random`类的使用、字符串操作、集合数据结构(如`HashSet`)以及可能的文件I/O操作。通过合理地组合这些元素,我们可以创建出一个满足特定需求的随机字符串生成器。

    C#产生不重复的随机数

    在IT领域,尤其是在编程语言C#中,生成不重复的随机数是一个常见且重要的需求,尤其是在游戏开发、安全系统、数据分析等应用场景中。本文将基于提供的文件内容,深入解析三种不同的方法来实现这一功能,旨在为读者...

    C#生成2位或N位不重复字母数字组合

    以上就是使用C#生成不重复字母数字组合的基本方法。通过理解并运用这个逻辑,你可以根据需求调整代码,生成适合自己应用场景的唯一标识。注意,生成的组合是随机的,因此每次调用生成方法时,结果都会不同。在某些...

    C#生成20000个不重复数据的工具

    总的来说,C#生成20000个不重复随机数的过程涉及到集合操作、随机数生成以及控制台输出。理解这些概念对于进行C#编程非常有帮助,尤其是在处理大量数据和实现特定逻辑时。通过这个工具,你可以轻松生成所需数量的无...

    C#生成不重复随机数列表实例

    代码如下:///  /// 生成不重复随机数列表实例 ///  /// ”count”&gt;不重复数数量 /// 不重复数列表 private static List&lt;int&gt; GetRandomList(int count) { List&lt;int&gt; list = new List(); int num = 0; ...

    连续生成大量随机数(不重复)

    通过循环创建随机种子来循环生成随机数,避免了重复调用Random的Next方法产生重复随机数的问题,程序里可设置文件的保存路径和产生的随机数长度

    让C#生成不重复随机数

    对于随机数,大家都知道,计算机不 可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称 作伪随机数。...

    不重复随机数生产器类 c#代码

    在C#编程中,生成不重复的随机数是一项常见的需求,尤其在游戏开发、数据分析、测试用例生成等领域。这个自编的不重复随机数生产器类提供了两种生成模式,旨在确保生成的随机数序列中不会出现重复,并且在不同范围内...

    C#中的生成随机数代码

    在C#编程语言中,生成随机数是一项常见的任务,它在各种应用场景中都有用到,如游戏开发、模拟计算、测试用例生成等。本文将详细介绍如何在C#中生成随机数,以及几种不同的实现方式。 首先,让我们了解C#中最基础的...

    C#随机生成时间戳

    总结来说,C#生成不重复时间戳的关键在于结合当前时间与高质量的随机数生成器,以减少重复的可能性。在ASP.NET应用中,这样的功能可以提升系统的可靠性和安全性。在实际应用中,根据业务需求和性能考虑,可以适当...

    c#产生随机数并冒泡排序

    下面是一个完整的C#程序示例,演示了如何使用随机数生成器生成随机数,并使用冒泡排序算法对数组进行排序: ```csharp using System; class Program { static void Main(string[] args) { int[] nums = new int...

    C# 生成随机数源代码

    3. **生成不重复随机数**:通过一个循环,我们可以不断从指定范围内生成新的随机数。每次生成时,先检查这个数是否已经在`HashSet`中,如果不在,则添加到集合中,表示成功生成一个不重复的随机数。如果已经存在,则...

    C#生成指定范围内的不重复随机数

    C#生成指定范围内的不重复随机数 // Number随机数个数 // minNum随机数下限 // maxNum随机数上限 public int[] GetRandomArray(int Number,int minNum,int maxNum) { int j; int[] b=new int[Number]; Random r...

    c#获取随机,检查随机数是否重复

    /// 随机数最小值 /// 是否包含最小值 /// 随机数最大值 /// 是否包含最大值 /// 随机结果数量 /// 结果是否重复&lt;/param&gt;

    产生20个不重复的随机数的代码

    在IT领域,生成不重复的随机数序列是一个常见的需求,尤其是在需要进行随机抽样、数据模拟或游戏开发等场景中。下面将详细解析如何通过编程实现这一目标,并深入探讨其背后的算法逻辑和技术要点。 ### 核心知识点:...

    C# 控制台应用程序——随机数

    生成一个从0到strTableChar.Length的数字a,然后使用strTableChar[a]就可以随机返回一个字母,重复n次(n等于防伪码的长度),这样就可以组合到一串随机字符串,也就是防伪码了。 6、思路及技巧 1)随机数生成...

    用C#生成不重复的随机数的代码

    在开发考试系统或类似需要生成不重复随机数据的场景中,C#的`System.Random`类扮演着关键角色。这个类允许我们生成一系列看似随机但实际上由算法控制的数值,也就是所谓的伪随机数。由于计算机无法生成真正的随机数...

    C#中的随机数使用概述一

    ### C#中的随机数使用概述 #### 一、引言 在C#编程语言中,随机数的生成是一项非常实用且常见的需求。无论是游戏开发、密码学应用还是模拟实验等领域,都离不开对随机数的支持。本文将系统地介绍C#中随机数的使用...

    针对.net的Random随机数生成器的扩展。

    对于扩展`Random`类以生成不重复随机数,我们可以使用一个集合来跟踪已生成的随机数,确保不会有重复。这里可能需要一个自定义方法,如`GetUniqueRandomNumbers(int count)`,它接受一个整数参数`count`,表示需要...

Global site tag (gtag.js) - Google Analytics