我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.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 < 15; i++) index = i; Random r = new Random(); //用来保存随机生成的不重复的10个数 int[] result = new int[10]; int site = 15;//设置下限 int id; for (int j = 0; j < 10; 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 < RmNum; i++) { 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<10;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 (arrNum[n]==tmp) //利用循环判断是否有重复 { tmp=ra.Next(minValue,maxValue); //重新随机获取。 getNum(arrNum,tmp,minValue,maxValue,ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。 } n++; } return tmp; }
|
分享到:
相关推荐
总结来说,C#生成不重复时间戳的关键在于结合当前时间与高质量的随机数生成器,以减少重复的可能性。在ASP.NET应用中,这样的功能可以提升系统的可靠性和安全性。在实际应用中,根据业务需求和性能考虑,可以适当...
本文将详细介绍如何在ASP.NET环境中生成随机数及其基本应用。 #### 一、System.Random 类介绍 在.NET Framework中,`System.Random`类提供了生成随机数的功能。该类位于`System`命名空间下,可以通过创建该类的...
总的来说,"随机摇奖功能(ASP.NET+C#.NET双版本)"项目为开发者提供了两种实现随机摇奖的示例,涵盖了Web和桌面环境,对于学习和理解C#.NET的随机数生成以及ASP.NET的AJAX技术都有很好的实践价值。
虽然上述方法可以有效地生成不重复的随机数,但在生成大量随机数时,这种方法可能会变得低效。为了进一步提高性能,可以考虑以下改进: - 使用 `HashSet<int>` 替代 `List<int>`,因为 `HashSet` 提供更快的查找操作...
此外,给定的标签提到了“AS”、“asp”、“asp.net”、“字母”和“随机数”,这表明该方法适用于各种 ASP.NET 相关的场景,例如生成验证码图像、创建唯一订单号或者设置安全的会话标识。 在实际开发中,你可能还...
随机生成不重复数字并存储到数组和ArrayList中 - **知识点**: - 使用`Random`类生成随机数。 - 使用`ArrayList`数据结构存储不重复元素。 - 循环判断与添加元素。 - 数组与集合之间的转换。 #### 2. ASP.NET...
综上所述,创建一个4位数字的ASP.NET验证码控件涉及了随机数生成、图像处理、服务器会话管理、自定义验证逻辑等多个方面,是Web开发中提高安全性的有效手段。通过合理的设计和实现,可以兼顾安全性和用户体验,为...
2. **使用C#生成随机字符串**: 在C#中,可以使用`Random`类生成随机数,然后通过字符映射表将这些数字转换为字母或数字,以创建验证码字符串。 3. **绘制验证码图片**: 一旦生成了验证码字符串,就需要用.NET的...
一个生成不重复随机数的方法 //生成不重复随机数算法 private int GetRandomNum(int i,int length,int up,int down) { int iFirst=0; Random ro=new Random(i*length*unchecked((int)DateTime.Now.Ticks));...
示例代码展示了如何生成一个不重复的随机整数数组,范围在1到100之间。这种方法确保了数组中的每个元素都是唯一的,避免了重复值的出现。 #### 3. ADO.NET数据库操作 ADO.NET是Microsoft开发的一套数据访问技术,...
接下来,使用 `Random` 类生成随机数,并确保不重复生成同一个数字,以得到独特的验证码字符串。 2. **创建图像**: - `CreateImage` 方法将随机生成的字符串转换为图像。首先检查字符串是否为空,然后创建一个新...
这可能包括从一个号码池中随机选择而不重复的算法,或者采用某种权重分配方式,使得某些号码出现的概率更高。 5. **事件驱动编程**:Windows Forms中的控件可以响应用户的操作,如点击按钮。开发者需要定义事件处理...
一种方法是使用优先队列(如C#中的`PriorityQueue`)存储每个奖项及其累积概率,每次生成随机数后,可以快速找到第一个累积概率大于等于随机数的奖项。另一种方法是使用二分查找,如果概率数组已经排序,可以提高...
内置的`System.Random`类可以用来生成随机整数,但若要生成不重复的随机号,我们需要额外的策略。一种常见方法是使用集合(如HashSet或List)来存储已生成的随机号,每次生成新的随机号时,先检查该号是否已存在于...
总的来说,C# ASP.NET中的验证码实现涉及生成随机数字或字母字符串,并可能包括将这些字符串转化为图像显示给用户。这个过程需要考虑到安全性、易用性和可维护性,以确保验证码机制能够有效地防止自动化攻击,同时对...
在.NET环境下,开发者可以利用C#、VB.NET等语言,结合Windows Forms、WPF或ASP.NET等技术来构建用户界面,同时借助ADO.NET进行数据库操作,实现数据的存储和读取。 在".NET的双色球"这个项目中,我们可以深入探讨...
在ASP.NET中开发在线考试系统时,随机抽题是核心功能之一,它要求从试题数据库中抽取指定数量的题目,并确保每次抽取的题目不重复。本文主要探讨如何利用SQL函数来解决这个问题。 1. **随机数生成** ASP.NET自带了...
- **Web应用程序开发:** 使用ASP.NET等框架开发网站。 - **游戏开发:** 使用Unity引擎开发跨平台的游戏。 - **移动应用开发:** 通过Xamarin等工具开发iOS和Android应用。 - **物联网(IoT):** 支持嵌入式...