`
380071587
  • 浏览: 447278 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一种生成不重复数的算法

 
阅读更多

在编程中经常遇到一些类似的问题,比如做一个双色球选号软件,其中6个双色球是从1到33之间选出6个数来,这6个数是不能重复的,这个问题就是我们今天要说的生成不重复数算法。
算法描述如下:从M个数中选出N个数来(0<N<=M),要求N个数之间不能有重复。
这个问题我以前用J2SE实现过,使用了ArrayList,每次随机在指定范围内选定一个数,然后查看结果集合中是否存在该数,如果存在继续下一轮循环,如果不存在,就将该数保存到结果集合中去。使用这种算法虽然也能实现要求,缺点是判断结果集合中是否存在该数时,需要通过一个循环来判断,这会增加算法运行的时间,虽然时间复杂度为n,但多次重复,还是一笔不小的开销。

下面要介绍的算法是,每次随机取出一个数,之后将该数放置到集合的末尾去,这样下次取随机数的时候,只从1到目标集合个数-1个中随机抽取,如此循环,这样就避免了判断在结果集合中判断是否存在相冲突的数的过程。

算法代码如下:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Diagnostics;
usingSystem.Management;

namespaceConsoleApplication
{
classProgram
{
staticvoidMain(string[]args)
{
int[]range=newint[33];
for(inti=0;i<33;i++)//初始化范围集合,从1到33
{
range[i]
=i+1;
}
int[]result=CreateNumbers(range,6);
for(inti=0;i<result.Length;i++)
{
Console.WriteLine(
"result[{0}]={1}",i,result[i]);
}
Console.ReadKey();
}

//取出不重复的6个数
staticint[]CreateNumbers(int[]range,intcount)
{
int[]result=newint[count];
Randomrandom
=newRandom();
intindex=0;
inttemp=0;
for(inti=0;i<count;i++)
{
index
=random.Next()%(range.Length-i);
result[i]
=range[index];
//将当前已使用过的数移至集合末尾,并且将末尾原来没有使用的数放到当前位置
temp=range[range.Length-1-i];
range[range.Length
-1-i]=range[index];
range[index]
=temp;
}
returnresult;
}

}
}

结果如下:

补充一下,另外一种不使用数组而使用可变集合的办法,这种算法的做法是使用了之后马上从源集合中清除掉(数组是

没有办法这么做的),因而也是可以做到生成不重复的随机数的。具体代码如下:

//取出不重复的6个数
staticList<int>CreateNumbers(List<int>range,intcount)
{
List
<int>result=newList<int>(count);
Randomrandom
=newRandom();
intindex=0;
for(inti=0;i<count;i++)
{
index
=random.Next()%range.Count;
result.Add(range[index]);
range.RemoveAt(index);
}
returnresult;
}

至于用法,也很简单:

List<int>range=newList<int>(33);
for(inti=0;i<33;i++)//初始化范围集合,从1到33
{
range.Add(i
+1);
}
List
<int>result=CreateNumbers(range,6);
for(inti=0;i<result.Count;i++)
{
Console.WriteLine(
"result[{0}]={1}",i,result[i]);
}

经万次测试,使用数组方法性能比使用List<int>范型集合高1/4。

分享到:
评论

相关推荐

    C++大作业 排序算法集合

    随机产生10000个浮点数,保存到a.txt文件中,再读取到内存中并分别用简单选择排序、冒泡排序、快速排序、希尔排序、归并排序、堆排序算法进行排序,显示排序过的数列的第1、10、100、1000、10000的具体数字和每个...

    题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

    题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。 程序源代码: main() { ...

    算法基础.打开算法之门.[美]托马斯 H.科尔曼(带详细书签)

    ●什么是计算机算法,能够采用一种方式来描述计算机算法,以及如何评估算法。 ●在计算机中查找信息的简单方式。 ●在计算机中重排信息以使其以一种预定顺序排列的方法。(我们称这一任务为“排序”。) ●如何解决...

    随机生成迷宫的算法,用两种方式:Prime,DFS实现

    思路其实大同小异,主要为:常见迷宫(即任意两点间都能够找到路径,且仅有一条成功路径),迷宫可看做一组连通图(用数组储存),默认所有点间都为墙,我们需要做的就是遍历整个图中所有的点,并且不重复访问,在遍历图的过程...

    算法Prim.zip

    普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为...

    银行家算法模拟c/c++

    银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。 设计目的 1)了解多道程序系统中,多个进程并发执行的资源分配。 2)掌握死锁的产生的原因、产生死锁的必要条件和...

    计算机算法设计与分析试题.doc

    搜索函数 21、下面关于NP问题说法正确的是(B ) A NP问题都是不可能解决的问题 B P类问题包含在NP类问题中 C NP完全问题是P类问题的子集 D NP类问题包含在P类问题中 22、蒙特卡罗算法是( B )的一种。 A、分支界限...

    Python编程实现生成特定范围内不重复多个随机数的2种方法

    这一问题的核心其实就是产生不重复随机数的问题。首先想到的递归的方法,然后才发现Python中居然已经提供了此方法的函数,可以直接使用。具体代码如下: #生成某区间内不重复的N个随机数的方法 import random; #1、...

    A*算法求解八数码问题_C#语言

    4)如果扩展出的新结点与队列中的结点不重复,则按照它的估价函数f大小将它插入队列中的头结点后待扩展结点的适当位置,使它们按从小到大的顺序排列,最后更新队列尾指针。 5)如果队列头的结点还可以扩展,直接返回...

    论文研究-基于Harris角点和SURF特征的遥感图像匹配算法.pdf

    Harris是一种高效的角点检测算法,但不具备尺度不变性。SURF(speeded-up robust features)算法虽然能很好地解决图像尺度变化问题,但是在特征点提取方面没有Harris稳定。针对Harris和SURF两种算法的特点,提出一种...

    页面置换算法

    请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的技术特点,掌握请求页式存储管理的页面置换算法。 2、实验内容 (1)通过随机数产生...

    精华游戏算法整理(经典)

    虽然本文只提供了一种计算H的方法,但是你可以在网上找到很多其他的方法。 我们的路径是通过反复遍历开启列表并且选择具有最低F值的方格来生成的。文章将对这个过程做更详细的描述。首先,我们更深入的看看如何计算...

    软件工程之专题十:算法分析与设计

    算法是对特定问题求解步骤的一种描述,算法是指令的有限序列,其中每一条指令表示一个或多个操作。 算法具有以下5个属性:  有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。  确定...

    Apriori算法,关联规则挖掘算法,人工智能

    Apriori算法是一种常见的关联规则挖掘算法,用于发现数据集中的频繁项集。在市场营销和产品推荐等领域中,它被广泛应用,以帮助企业根据客户购买模式制定更加精准的营销策略。 Apriori算法基于以下两个假设: 如果...

    算法模板.zip

    观察前面的dfs算法,对于层次相同的边,会经过多次重复运算,很浪费时间,那么,可以考虑先对原图分好层产生新的层次图, 即保存了每个点的层次,注意,很多人会把这里的边的最大容量跟以前算最短路时的那个权值混淆...

    算法与数据结构课程设计说明书

    埃拉托色尼筛法(Sieve of Eratosthenes)是一种用来求所有小于N的素数的方法。从建立一个整数2~N的表着手,寻找i˂ 的整数,编程实现此算法,并讨论运算时间。(1) 2. 猴子吃桃子问题。有一群猴子摘了一堆桃子,...

    数据结构与算法.xmind

    求最小生成树的Prim算法和Kruskal算法 爬山问题 回溯算法 n皇后问题 动态规划Dynamic Planning 应用 求最长公共子序列LCS 矩阵连乘问题 爬楼梯问题 找零问题 0-1背包问题 分治算法...

    【matlab】基于BP算法和遗传算法的自适应噪声抵消器

    二、基于BP算法和遗传算法相结合的自适应噪声抵消器在本文中,作者主要基于自适应噪声对消的原理对自适应算法进行研究,提出了一种新的算法,即BP算法和遗传算法相结合的自适应算法。 作者对BP网络的结构及算法作了...

    WSN中基于协作水印的虚假数据过滤算法

    提出一种基于协作水印的数据认证算法来识别虚假数据和重复包,算法在每个数据包中嵌入两类水印: 一类是鲁棒性水印,用于对发送者的身份和数据的新鲜性进行认证;另一类是由t 个证人节点协作生成、嵌入的半脆 弱水印,...

    重复和非重复的从头基因组装配算法

    为了解决这个问题,我们提出了一种新的基因组组装算法,即SWA,它具有四个属性:(1)组装重复和非重复; (2)采用新的重叠扩展策略来扩展每个种子; (3)采用滑动窗口滤除排序偏差; (4)提出了一种针对低覆盖...

Global site tag (gtag.js) - Google Analytics