问题描述:

给定输入N,生成从1开始的:1,2,3,4,......N 一组随机序列,序列中的数不能重复出现。

比如:N=5,合法的随机序列为{4,3,1,5,2} 、{3,1,4,2,5}……非法的序列有{5,4,1,2,1}

来源:《数据结构与算法分析-MAW著  第二章习题2.8》

思路1:

对于数据a[N]而言,当随机生成第i个数a[i]时,确保a[i]在 a[0]至a[i-1]中没有出现过,就把该数放入a[i],继续生成下一个数a[i+1]

算法复杂度为O(N^2logN)---每生成一个a[i],需要扫描a[0]...a[i-1]。

public static int[] algorithm1(int N) {
int []a = new int[N];
for (int i = 0; i < a.length; ++i) {
while (true) {
a[i] = randInt(1, N); //生成[1,N]之间的一个随机数
            int j = 0;
for (; j < i; ++j) {
if (a[i] == a[j]) {
break;//如果这个随机数已经在前面出现过了,break,下一轮继续生成另一个随机数,直至a[i]与前面所有的数不同
}
} //end for if(j == i)
  break;//本次生成的a[i]在前面没有出现过, break while, i++,下一轮生成a[i+1]
}//end while
}
return a;
}

思路2:

先以1,2,3,.....N 初始化数组a[N],然后随机选择一个数组下标,交换这两个下标处的值。

算法复杂度为O(N)

public static int[] algorithm3(int N){
int[] a = new int[N];
for(int i = 1; i <= N; i++)
a[i-1] = i;
for(int i = 1; i < N; i++)
swapReference(a, i, randInt(0, i));
return a;
} private static void swapReference(int[] a, int i, int j){
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}

JAVA中采用java.util.Random类的nextInt(int n)方法可生成一个[0,n)的随机数。---包括0不包括n

要生成范围[i,j]内的一个随机数,方法如下:

①nextInt(j-i+1)----生成[0, j-i+1)之间的随机数

②nextInt(j-i+1)+i  生成 [i, j+1)之间的随机数,即为[i,j]内的一个随机数了。

性能比较:当N=1w时,algorithm1用时42ms,algorithm3用时2ms

当N=10w时,algorithm1用时2806ms,algorithm3用时12ms

整个程序代码如下:

import java.util.Random;

public class C2_2_8 {

    private static Random rand = new Random(47);
//生成一个[i,j]之间的随机数
public static int randInt(int i, int j){
return rand.nextInt(j-i+1) + i;
} public static int[] algorithm1(int N) {
int []a = new int[N];
for (int i = 0; i < a.length; ++i) {
while (true) {
a[i] = randInt(1, N); //生成[1,N]之间的一个随机数
for (int j = 0; j < i; ++j) {
if (a[i] == a[j]) {
break;//如果这个随机数已经在前面出现过了,break,下一轮继续生成另一个随机数,直至a[i]与前面所有的数不同
}
} //end for break;//本次生成的a[i]在前面没有出现过, break while, i++,下一轮生成a[i+1]
}//end while
}
return a;
} public static int[] algorithm3(int N){
int[] a = new int[N];
for(int i = 1; i <= N; i++)
a[i-1] = i;
for(int i = 1; i < N; i++)
swapReference(a, i, randInt(0, i));
return a;
}       //生成一个即有正数又有负数的随机数组
      public static int[] randomArr(int N){
          int [] a = new int[N];
          for(int i = 1; i <= N/2; i++)
              a[i-1] = i;
          for(int j = N; j > N/2; j--)
              a[j-1] = -j;
          for(int i = 1; i < N; i++)
              swapReference(a, i, randInt(0, i));
          return a;
      } private static void swapReference(int[] a, int i, int j){
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
} public static void main(String[] args) { long start3 = System.currentTimeMillis();
algorithm3(100000);
System.out.println(System.currentTimeMillis() - start3); long start = System.currentTimeMillis();
algorithm1(100000);
long time = System.currentTimeMillis() - start;
System.out.println(time);
}
}

随机序列生成算法---生成前N个整数的一组随机序列的更多相关文章

  1. 转:体积阴影(Shadow Volumes)生成算法

    下面以最快的速度简单谈谈阴影生成技术,目前普遍采用的一般有三种:Planar Shadow.Shadow Mapping和Shadow Volume,前者类似投影,计算最简单,缺点只能绘制抛射在平面上 ...

  2. Twitter的SnowFlake分布式id生成算法

    二进制相关知识回顾 1.所有的数据都是以二进制的形式存储在硬盘上.对于一个字节的8位到底是什么类型 计算机是如何分辨的呢? 其实计算机并不负责判断数据类型,数据类型是程序告诉计算机该如何解释内存块. ...

  3. 微博短链接的生成算法(Java版本)

    最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责 ...

  4. 理解分布式id生成算法SnowFlake

    理解分布式id生成算法SnowFlake https://segmentfault.com/a/1190000011282426#articleHeader2 分布式id生成算法的有很多种,Twitt ...

  5. 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型

    from:http://www.freebuf.com/articles/network/139697.html DGA(域名生成算法)是一种利用随机字符来生成C&C域名,从而逃避域名黑名单检 ...

  6. 美团技术分享:深度解密美团的分布式ID生成算法

    本文来自美团技术团队“照东”的分享,原题<Leaf——美团点评分布式ID生成系统>,收录时有勘误.修订并重新排版,感谢原作者的分享. 1.引言 鉴于IM系统中聊天消息ID生成算法和生成策略 ...

  7. ID生成算法(一)——雪花算法

    JavaScript生成有序GUID或者UUID,这时就想到了雪花算法. 原理介绍: snowFlake算法最终生成ID的结果为一个64bit大小的整数,结构如下图: 解释: 1bit.二进制中最高位 ...

  8. 图形学入门(1)——直线生成算法(DDA和Bresenham)

    开一个新坑,记录从零开始学习图形学的过程,现在还是个正在学习的萌新,写的不好请见谅. 首先从最基础的直线生成算法开始,当我们要在屏幕上画一条直线时,由于屏幕由一个个像素组成,所以实际上计算机显示的直线 ...

  9. SnowFlake --- 分布式id生成算法

    转载自:https://segmentfault.com/a/1190000011282426 概述 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1位,不用.二进 ...

随机推荐

  1. ajax跨子域请求的两种现代方法

    因为面向互联网的性质,我们公司的大部分系统都采用多子域的方式进行开发和部署,以达到松耦合和分布式的目的,因此子系统间的交互不可避免.虽然通过后台的rpc框架解决了大部分的交互问题,但有些情况下,前端直 ...

  2. css清除浮动定位造成的异常

    清除浮动是为了解决高度塌陷的问题:内层有好几个div有宽有高,并且选择了浮动定位,但是外层的div却并没有设置宽高.在非IE浏览器(如Firefox)下,当容器的高度为auto,且容器的内容中有浮动( ...

  3. 地理数据可视化:Simple,Not Easy

    如果要给2015年的地理信息行业打一个标签,地理大数据一定是其中之一.在信息技术飞速发展的今天,“大数据”作为一种潮流铺天盖地的席卷了各行各业,从央视的春运迁徙图到旅游热点预测,从大数据工程师奇货可居 ...

  4. Mybatis学习记录(四)----resultMap的使用

    resultMap使用方法 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系. 1.定义resultMap 2.使用resultMap ...

  5. Atitit.工作流系统的本质是dsl 图形化的dsl  4gl

    Atitit.工作流系统的本质是dsl 图形化的dsl  4gl 1. 工作流系统的本质是dsl 图形化的dsl  4gl1 2. 为什么每个项目系统都需要工作流1 3. 工作流dsl与java .n ...

  6. Jsoup解析Html中文文档

    jsoup 简介Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HTM ...

  7. 浅谈PopupWindow弹出菜单

    实现将一个View显示在某一位置,而且是浮于当前窗口 首先要有一个要显示的view的布局,可以是任意View,包括ViewGroup <?xml version="1.0" ...

  8. 关于https的Error:Error Domain=NSURLErrorDomain Code=-1012

    昨天闲着没事就随便搞点demo,随便找了一个https的接口,运行之后,一直发现Error Domain=NSURLErrorDomain Code=-1012.好奇怪,请求https的配置我基本都配 ...

  9. win10中文简体繁体切换快捷键

    win10中文简体繁体切换快捷键Ctrl+Shift+F

  10. 关于zend_parse_parameters函数

    PHP_FUNCTION(set_time_limit) { long new_timeout; char *new_timeout_str; int new_timeout_strlen; if ( ...