用C#生成不反复的随机数
版权声明:本文为博主原创文章。未经博主同意不得转载。
https://blog.csdn.net/xiebaochun/article/details/28900237
对于随机数,大家都知道,计算机不可能产生全然随机的数字。所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟全然随机数,这样的随机数被称 作伪随机数。伪随机数是以同样的概率从一组有限的数字中选取的。所选数字并不具有全然的随机性,可是从有用的角度而言。其随机程度已足够了。
伪随机数的选 择是从随机种子開始的,所以为了保证每次得到的伪随机数都足够地“随机”。随机种子的选择就显得非常重要。假设随机种子一样,那么同一个随机数发生器产生 的随机数也会一样。一般地,我们使用同系统时间有关的參数作为随机种子,这也是.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#生成不反复的随机数的更多相关文章
- js生成[n,m]的随机数 以及实际运用
Math.ceil(); //向上取整. Math.floor(); //向下取整. Math.round(); //四舍五入. Math.random(); //0.0 ~ 1.0 之间的一 ...
- js生成[n,m]的随机数
一.预备知识 Math.ceil(); //向上取整. Math.floor(); //向下取整. Math.round(); //四舍五入. Math.random(); //0.0 ~ 1 ...
- C#生成不重复的随机数(转)
我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复随机数的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random. 对于随机数,大家都知道,计算机 ...
- JS生成某个范围的随机数(四种情况)
前言: JS没有现成的函数,能够直接生成指定范围的随机数. 但是它有个函数:Math.random() 这个函数可以生成 [0,1) 的一个随机数. 利用它,我们就可以生成指定范围内的随机数. 而涉 ...
- [转载][记录]javascript生成不重复的随机数
参考链接:javascript生成不重复的随机数 项目播放视频,是无序的,有上下两个按钮,所以需要生成1,8不重复的随机数数组,如: ,,,,,,, 然后再split一次,就是数组了. 拿来主义了
- js生成[n,m]的随机数,js如何生成随机数,javascript随机数Math.random()
一.预备知识 Math.ceil(); //向上取整. Math.floor(); //向下取整. Math.round(); //四舍五入. Math.random(); //0.0 ~ 1 ...
- 生成N位数字随机数
//生成N位的随机数 全数字 private string GetRandom(int len) { string k = ""; Random rand = new Random ...
- JS生成某个范围的随机数【四种情况详解】
JS没有现成的函数,能够直接生成指定范围的随机数. 但是它有个函数:Math.random() 这个函数可以生成 [0,1) 的一个随机数. 利用它,我们就可以生成指定范围内的随机数. 而涉及范围的 ...
- 给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数。 (即,使用函数rand5()来实现函数rand7())
给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数. (即,使用函数rand5()来实现函数rand7()). 解答 rand5可以随机生成1,2,3,4,5:rand7可以随机生成1 ...
随机推荐
- PIE SDK主/次要分析
1.算法功能简介 主要分析功能是采用类似卷积滤波的方法将较大类别中的虚假像元归到该类中,首先定义一个变换核尺寸,然后用变换核中占主要地位(像元最多)类别数代替中心像元的类别数,次要分析相反,用变换核中 ...
- QiyeProject SpringMVC 项目 d15866p148.iok.la 主要做主页应用,消息应用不管了 用户微信号有点像乱码的那个是openID 找同伴:在项目的GitHub页面里找提问过的人,还有fork,star的人
消息型应用支持文本.图片.语音.视频.文件.图文等消息类型. 主页型应用只支持文本消息类型,且文本长度不超过20个字. 填写必要信息 URL /QiyeProject/src/org/oms/qiye ...
- keepalived+lvs简单实现
一,部署实战环节 01,服务架构图: 服务器镜像为centos6.9 02,服务安装: 10.0.0.10: 下载keeplived官方包--> http://www.keepalived. ...
- Http编程之HttpClient
在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端.它提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET ...
- adb调试安卓
http://blog.csdn.net/liushida00/article/details/49797239
- RequireJS 2.0 正式发布
就在前天晚上RequireJS发布了一个大版本,直接从version1.0.8升级到了2.0.随后的几小时James Burke又迅速的将版本调整为2.0.1,当然其配套的打包压缩工具r.js也同时升 ...
- [转]ASP.NET MVC中的两个Action之间值的传递--TempData
本文转自:ASP.NET MVC中的两个Action之间值的传递--TempData 一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在 ...
- GridView .net访问
HTML code <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns=&qu ...
- c#中日期的处理
DateTime.Now.ToShortDateString()//只取日期DateTime.Now.ToLongTimeString();//只取时间搞定DateTime.Now.ToShortTi ...
- sql查询时,根据特定的条件给表的某一个字段赋值
先讲一下需要这个需求的情景: 这是一个招聘求职项目遇到的一个问题.个人A向公司B的职位投递简历后,公司B会收到个人A的简历;但是A投递后把简历删除,公司收到的简历信箱 还有这个简历,但却不能看了. 原 ...