如何生成一定范围的随机数内不重复的随机数

查看: 3844|回复: 14
怎么生成不出现重复数字的随机9位数
阅读权限90
签到天数:10 天结帖率: (30/67)
怎么生成不出现重复数字的随机9位数
http://bbs.125.la/forum.php?mod=viewthread&tid=&highlight=%B2%BB%D6%D8%B8%B4%2B%CA%FD%D7%D6%2B%C9%FA
回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至
可获得加分喔。友情提醒:本版被采纳的主题可在
帖子申请荣誉值,获得 1点 荣誉值,荣誉值可兑换终身vip用户组哦。快捷通道: →
阅读权限228
签到天数: 13 天结帖率: (2/2)
热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!
您可以选择打赏方式支持他
阅读权限90
签到天数: 3 天结帖率: (20/28)
&&子程序1整数型&fh文本型&&计次循环首 (9, )fh = fh + 到文本 (取随机数 (0, 9))计次循环尾 ()返回 (到整数 (fh)).版本 2
.子程序 子程序1, 整数型
.局部变量 fh, 文本型
.计次循环首 (9, )
& & fh = fh + 到文本 (取随机数 (0, 9))
.计次循环尾 ()
返回 (到整数 (fh))
您可以选择打赏方式支持他
阅读权限165
结帖率: (28/28)
.子程序 子程序1, 整数型
.局部变量 fh, 文本型
置随机数种子()
.计次循环首 (9, )
& & fh = fh + 到文本 (取随机数 (0, 9))
.计次循环尾 ()
返回 (到整数 (fh))
楼上的表打我
您可以选择打赏方式支持他
阅读权限90
签到天数: 3 天结帖率: (20/28)
&&子程序1整数型&fh文本型&&置随机数种子 ()计次循环首 (9, )fh = fh + 到文本 (取随机数 (0, 9))计次循环尾 ()返回 (到整数 (fh)).版本 2
.子程序 子程序1, 整数型
.局部变量 fh, 文本型
置随机数种子 ()
.计次循环首 (9, )
& & fh = fh + 到文本 (取随机数 (0, 9))
.计次循环尾 ()
返回 (到整数 (fh))
您可以选择打赏方式支持他
阅读权限90
签到天数: 10 天结帖率: (30/67)
[e=1].版本 2
里面有重复的数字阿。
您可以选择打赏方式支持他
阅读权限228
签到天数: 27 天
本帖最后由 Hoibben 于
20:47 编辑
里面有重复的数字阿。
您可以选择打赏方式支持他
阅读权限150
结帖率: (2/2)
.子程序 _按钮1_被单击
.局部变量 数组, 整数型, , &10&
.局部变量 计次, 整数型
.局部变量 数值, 整数型
.局部变量 九位数, 文本型
数组 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }
置随机数种子 ()
.计次循环首 (9, 计次)
& & 数值 = 取随机数 (1, 取数组成员数 (数组))
& & .如果真 (数组 [数值] = 0 且 计次 = 1)
& && &&&删除成员 (数组, 数值, )
& && &&&数值 = 取随机数 (1, 取数组成员数 (数组))
& & .如果真结束
& & 九位数 = 九位数 + 到文本 (数组 [数值])
& & 删除成员 (数组, 数值, )
.计次循环尾 ()
输出调试文本 (九位数)
您可以选择打赏方式支持他
阅读权限165
签到天数: 26 天结帖率: (4/4)
楼主,最简便的方法~
21:11 上传
点击文件名下载附件
1.16 KB, 下载次数: 18
您可以选择打赏方式支持他
阅读权限90
结帖率: (7/7)
&&窗口程序集名保 留&&保 留备 注窗口程序集1&&&__启动窗口_创建完毕&&_按钮1_被单击&&数值整数型&0计次整数型&&编辑框1.内容 = “”文本_取不重复数字 (数值, 9, 0, 9)判断 (数值 [1] = 0)删除成员 (数值, 1, 1)加入成员 (数值, 0)计次循环首 (9, 计次)编辑框1.内容 = 编辑框1.内容 + 到文本 (数值 [计次])计次循环尾 ()计次循环首 (9, 计次)编辑框1.内容 = 编辑框1.内容 + 到文本 (数值 [计次])计次循环尾 ()文本_取不重复数字√取出N组不重复数字,如:在1-100之间取出80个数字,要求不重复。返回值整数型√&√存放取出来的数组欲取多少组整数型&&&要取多少组最小值整数型&&&要取的最小数值最大值整数型&&&要取的最大数值计次整数型&&大计次整数型&&随机数整数型&&计次循环首 (欲取多少组, 大计次)随机数 = _取随机数 (最小值, 最大值)如果 (取数组成员数 (返回值) > 0)循环判断首 ()计次 = 计次 + 1如果真 (随机数 = 返回值 [计次])随机数 = _取随机数 (最小值, 最大值)计次 = 0到循环尾 ()如果真 (随机数 ≠ 返回值 [计次] 且 计次 = 取数组成员数 (返回值))加入成员 (返回值, 随机数)计次 = 0跳出循环 ()循环判断尾 (计次 ≠ 取数组成员数 (返回值))加入成员 (返回值, 随机数)计次循环尾 ()_取随机数整数型√汇编方式取随机数,最小数不能大于最大数,否则获取为0最小数整数型&&&最大数整数型&&&如果真 (最大数 < 最小数)返回 (0)置入代码 ({ 81, 82, 15, 49, 185, 23, 0, 0, 0, 247, 225, 131, 192, 7, 139, 77, 12, 43, 77, 8, 65, 51, 210, 247, 241, 3, 85, 8, 139, 194, 90, 89, 201, 194, 8, 0 })返回 (0).版本 2
.程序集 窗口程序集1
.子程序 __启动窗口_创建完毕
.子程序 _按钮1_被单击
.局部变量 数值, 整数型, , &0&
.局部变量 计次, 整数型
编辑框1.内容 = “”
文本_取不重复数字 (数值, 9, 0, 9)
.判断开始 (数值 [1] = 0)
& & 删除成员 (数值, 1, 1)
& & 加入成员 (数值, 0)
& & .计次循环首 (9, 计次)
& && &&&编辑框1.内容 = 编辑框1.内容 + 到文本 (数值 [计次])
& & .计次循环尾 ()
& & .计次循环首 (9, 计次)
& && &&&编辑框1.内容 = 编辑框1.内容 + 到文本 (数值 [计次])
& & .计次循环尾 ()
.子程序 文本_取不重复数字, , 公开, 取出N组不重复数字,如:在1-100之间取出80个数字,要求不重复。
.参数 返回值, 整数型, 参考 数组, 存放取出来的数组
.参数 欲取多少组, 整数型, , 要取多少组
.参数 最小值, 整数型, , 要取的最小数值
.参数 最大值, 整数型, , 要取的最大数值
.局部变量 计次, 整数型
.局部变量 大计次, 整数型
.局部变量 随机数, 整数型
.计次循环首 (欲取多少组, 大计次)
& & 随机数 = _取随机数 (最小值, 最大值)
& & .如果 (取数组成员数 (返回值) > 0)
& && &&&.循环判断首 ()
& && && && &计次 = 计次 + 1
& && && && &.如果真 (随机数 = 返回值 [计次])
& && && && && & 随机数 = _取随机数 (最小值, 最大值)
& && && && && & 计次 = 0
& && && && && & 到循环尾 ()
& && && && &.如果真结束
& && && && &.如果真 (随机数 ≠ 返回值 [计次] 且 计次 = 取数组成员数 (返回值))
& && && && && & 加入成员 (返回值, 随机数)
& && && && && & 计次 = 0
& && && && && & 跳出循环 ()
& && && && &.如果真结束
& && &&&.循环判断尾 (计次 ≠ 取数组成员数 (返回值))
& && &&&加入成员 (返回值, 随机数)
& & .如果结束
.计次循环尾 ()
.子程序 _取随机数, 整数型, 公开, 汇编方式取随机数,最小数不能大于最大数,否则获取为0
.参数 最小数, 整数型
.参数 最大数, 整数型
.如果真 (最大数 < 最小数)
& & 返回 (0)
.如果真结束
置入代码 ({ 81, 82, 15, 49, 185, 23, 0, 0, 0, 247, 225, 131, 192, 7, 139, 77, 12, 43, 77, 8, 65, 51, 210, 247, 241, 3, 85, 8, 139, 194, 90, 89, 201, 194, 8, 0 })
您可以选择打赏方式支持他
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
防范网络诈骗,远离网络犯罪
违法和不良信息举报电话,企业QQ: ,邮箱:@
Powered by
粤公网安备 25&&&&&&正文
用C#生成不重复的随机数
摘要:对于随机数,计算机不可能产生完全随机的数字,所谓的随机数发生器器是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称 作伪随机数。
我们在做能自动生成试卷的考题时,常常需要随机生成一组不重复的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random。   对于随机数,大家都知道,都计算机不 可能产生完全随机的数字,所谓的随机数发生器是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称 作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。伪随机数的选 择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生 的随机数也会一样。一般地,我们使用同系统时间有关的参数作为随机种子,这也是.net Framework中的随机数发生器默认采用的方法。   我们可以使用两种方式初始化一个随机数发生器:   第一种方法不指定随机种子,系统自动选取当前时间作为随机种子:   Random ro = new Random();[color=rgb(51, 102, 153) !important]复制代码  第二种方法可以指定一个int型参数作为随机种子:   int iSeed=10;  Random ro = new Random(10);  long tick = DateTime.Now.T  Random ran = new Random((int)(tick & 0xffffffffL) | (int) (tick && 32));[color=rgb(51, 102, 153) !important]复制代码  这样可以保证99%不是一样。   之后,我们就可以使用这个Random类的对象来产生随机数,这时候要用到Random.Next()方法。这个方法使用相当灵活,你甚至可以指定产生的随机数的上下限。   不指定上下限的使用如下:   int iR  iResult=ro.Next();[color=rgb(51, 102, 153) !important]复制代码  下面的代码指定返回小于100的随机数:   int iR  int iUp=100;  iResult=ro.Next(iUp);[color=rgb(51, 102, 153) !important]复制代码  而下面这段代码则指定返回值必须在50-100的范围之内:   int iR  int iUp=100;  int iDown=50;  iResult=ro.Next(iDown,iUp);[color=rgb(51, 102, 153) !important]复制代码  除了Random.Next()方法之外,Random类还提供了Random.NextDouble()方法产生一个范围在0.0-1.0之间的随机的双精度浮点数:   double dR  dResult=ro.NextDouble();[color=rgb(51, 102, 153) !important]复制代码  但是用Random类生成题号,会出现重复,特别是在数量较小的题目中要生成不重复的的题目是很难的,参考了网上的一些方法,包括两类,一类是通过随机种子入手,使每一次的随机种子不同,来保证不重复;第二类是使用一些数据结构和算法。下面主要就第二类介绍几个方法。
& &方法1:思想是用一个数组来保存索引号,先随机生成一个数组位置,然后把这个位置的索引号取出来,并把最后一个索引号复制到当前的数组位置,然后使随机 数的上限减一,具体如:先把这100个数放在一个数组内,每次随机取一个位置(第一次是1-100,第二次是1-99,...),将该位置的数用最后的数 代替。   int[] index = new int[15];  for (int i = 0; i & 15; i++)    index =  Random r = new Random();[color=rgb(51, 102, 153) !important]复制代码  //用来保存随机生成的不重复的10个数  int[] result = new int[10];  int site = 15;//设置下限    for (int j = 0; j & 10; j++)  {    id = r.Next(1, site - 1);    //在随机位置取出一个数,保存到结果数组    result[j] = index[id];    //最后一个数复制到当前位置    index[id] = index[site - 1];    //位置的下限减少一    site--;  }[color=rgb(51, 102, 153) !important]复制代码  方法2:利用Hashtable。[NextPage]   Hashtable hashtable = new Hashtable();  Random rm = new Random();  int RmNum = 10;  for (int i = 0; hashtable.Count & RmN i++)  { &    int nValue = rm.Next(100); &   &if (!hashtable.ContainsValue(nValue) && nValue != 0) &   &{    hashtable.Add(nValue, nValue); &   & Console.WriteLine(nValue.ToString()); &   &}  }[color=rgb(51, 102, 153) !important]复制代码  方法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++;    }      }[color=rgb(51, 102, 153) !important]复制代码[color=rgb(51, 102, 153) !important]
全国校区查询
新手入门点击榜
读取xml文件转成List对象的两种方法
新手入门最新文章
官方新版意见收集
*您的积极反馈是我们前进的动力
官方新版意见收集
提交成功,感谢您的反馈。
我们会认真阅读和考虑每个用户的反馈。本博专注于基于微软技术的搜索相关技术
posts - 189, comments - 3709, trackbacks - 26, articles - 0
本文将讲述一个高效的不重复随机数列的生成算法,其效率比通常用hashtable 消重的方法要快很多。
作者:eaglet 转载请注明出处。
首先我们来看命题:
给定一个正整数n,需要输出一个长度为n的数组,数组元素是随机数,范围为0 – n-1,且元素不能重复。比如 n = 3 时,需要获取一个长度为3的数组,元素范围为0-2,
比如 0,2,1。
这个问题的通常解决方案就是设计一个 hashtable ,然后循环获取随机数,再到 hashtable 中找,如果hashtable 中没有这个数,则输出。下面给出这种算法的代码
public static int[] GetRandomSequence0(int total)
int[] hashtable = new int[total];
int[] output = new int[total];&
Random random = new Random();
for (int i = 0; i & i++)
int num = random.Next(0, total);
while (hashtable[num] & 0)
num = random.Next(0, total);
output[i] =
hashtable[num] = 1;
代码很简单,从 0 到 total - 1 循环获取随机数,再去hashtable 中尝试匹配,如果这个数在hashtable中不存在,则输出,并把这个数在hashtable 中置1,否则循环尝试获取随机数,直到找到一个不在hashtable 中的数为止。这个算法的问题在于需要不断尝试获取随机数,在hashtable 接近满时,这个尝试失败的概率会越来越高。
那么有没有什么算法,不需要这样反复尝试吗?答案是肯定的。
如上图所示,我们设计一个顺序的数组,假设n = 4
第一轮,我们取 0 – 3 之间的随机数,假设为2,这时,我们把数组位置为2的数取出来输出,并把这个数从数组中删除,这时这个数组变成了
第二轮,我们再取 0-2 之间的随机数,假设为1,并把这个位置的数输出,同时把这个数从数组删除,以此类推,直到这个数组的长度为0。这时我们就可以得到一个随机的不重复的序列。
这个算法的好处是不需要用一个hashtable 来存储已获取的数字,不需要反复尝试。算法代码如下:
public static int[] GetRandomSequence1(int total)
List&int& input = new List&int&();
for (int i = 0; i & i++)
input.Add(i);
List&int& output = new List&int&();&
Random random = new Random();
for (int i = 0; i & i++)
int num = random.Next(0, end);
output.Add(input[num]);
input.RemoveAt(num);
return output.ToArray();
这个算法把两个循环改成了一个循环,算法复杂度大大降低了,按说速度应该比第一个算法要快才对,然而现实往往超出我们的想象,当total = 100000 时,测试下来,第一个算法用时 44ms, 第二个用时 1038 ms ,慢了很多!这是为什么呢?问题的关键就在这个 input.RemoveAt 上了,我们知道如果要删除一个数组元素,我们需要把这个数组元素后面的所有元素都向前移动1,这个移动操作是非常耗时的,这个算法慢就慢在这里。到这里,可能有人要说了,那我们不用数组,用链表,那删除不就很快了吗?没错,链表是能解决删除元素的效率问题,但查找的速度又大大降低了,无法像数组那样根据数组元素下标直接定位到元素。所以用链表也是不行的。到这里似乎我们已经走到了死胡同,难道我们只能用hashtable& 反复尝试来做吗?在看下面内容之前,请各位读者先思考5分钟。
…… 思考5分钟
算法就像一层窗户纸,隔着窗户纸,你永远无法知道里面是什么,一旦捅穿,又觉得非常简单。这个算法对于我,只用了2分钟时间想出来,因为我经常实现算法,脑子里有一些模式,如果你的大脑还没有完成这种经验的积累,也许你要花比我长很多的时间来考虑这个问题,也许永远也找不到捅穿它的方法。不过不要紧,我把这个方法公布出来,有了这个方法,你只需轻轻一动,一个完全不同的世界便出现在你的眼前。原来就这么简单……。
还是上面那个例子,假设 n = 4
第一轮,我们随机获得2时,我们不将 2 从数组中移除,而是将数组的最后一个元素移动到2的位置
这时数组变成了
第二轮我们对 0-2 取随机数,这时数组可用的最后一个元素位置已经变成了2,而不是3。假设这时取到随机数为1
我们再把下标为2 的元素移动到下标1,这时数组变成了
以此类推,直到取出n个元素为止。
这个算法的优点是不需要用一个hashtable 来存储已获取的数字,不需要反复尝试,也不用像上一个算法那样删除数组元素,要做的只是每次把数组有效位置的最后一个元素移动到当前位置就可以了,这样算法的复杂度就降低为 O(n) ,速度大大提高。
经测试,在 n= 100000 时,这个算法的用时仅为7ms。
下面给出这个算法的实现代码
/// &summary&
/// Designed by eaglet
/// &/summary&
/// &param name="total"&&/param&
/// &returns&&/returns&
public static int[] GetRandomSequence2(int total)
int[] sequence = new int[total];
int[] output = new int[total];&
for (int i = 0; i & i++)
sequence[i] =
Random random = new Random();&
int end = total - 1;&
for (int i = 0; i & i++)
int num = random.Next(0, end + 1);
output[i] = sequence[num];
sequence[num] = sequence[end];
下面是n 等于1万,10万和100万时的测试数据,时间单位为毫秒。从测试数据看GetRandomSequence2的用时和n基本成正比,线性增长的,这个和理论上的算法复杂度O(n)也是一致的,另外两个算法则随着n的增大,用时超过了线性增长。在1百万时,我的算法比用hashtable的算法要快10倍以上。
GetRandomSequence0
GetRandomSequence1
GetRandomSequence22015年1月 C/C++大版内专家分月排行榜第二2012年3月 C/C++大版内专家分月排行榜第二2011年11月 C/C++大版内专家分月排行榜第二2010年6月 C/C++大版内专家分月排行榜第二2010年5月 C/C++大版内专家分月排行榜第二
2011年4月 C/C++大版内专家分月排行榜第三2011年2月 C/C++大版内专家分月排行榜第三2010年8月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年3月 C/C++大版内专家分月排行榜第三
2011年9月 C/C++大版内专家分月排行榜第二2011年4月 C/C++大版内专家分月排行榜第二2010年11月 C/C++大版内专家分月排行榜第二
2011年6月 C/C++大版内专家分月排行榜第三
2010年5月 C/C++大版内专家分月排行榜第三2010年3月 C/C++大版内专家分月排行榜第三2010年1月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。如何在excel 中产生不重复随机数
本回答由提问者推荐}

我要回帖

更多关于 生成指定范围的随机数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信