问题描述:

给定输入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. 从几篇文字得到关于web app开发的性能问题的答案

    1. http://blogs.adobe.com/creativecloud/are-mobile-web-apps-slow/ 2. http://software.intel.com/zh-cn ...

  2. PHP学习笔记:keditor的使用

    keditor时一个免费的开源编辑器,很多公司在使用(百度编辑器也不错).最近为了做一个客户信息管理系统,在发送邮件模块用到这个编辑器,也算学习一下新的东西. 第一步:下载编辑器 到它的官网下载:ht ...

  3. 二进制打印与逆序_C语言(转)

    //二进制逆序 by MoreWindows( http://blog.csdn.net/MoreWindows ) #include <stdio.h> //二进制打印函数 templa ...

  4. window下从硬盘安装linux系统iso镜像文件的方法

    首先,需要安装grub2win,http://sourceforge.net/projects/grub2win/ 其次,将iso文件放在grub2可识别的分区, 如c:\abc\iso.iso 最后 ...

  5. 解决maven项目update project会更改jdk版本问题

    一.问题描述             在Eclipse中新建了一个Maven工程, 然后更改JDK版本为1.6, 结果每次使用Maven > Update project的时候JDK版本都恢复成 ...

  6. 【使用 DOM】为DOM元素设置样式

    1. 使用样式表 可以通过document.styleSheets属性访问文档中可用的CSS样式表,它会返回一组对象集合,这些对象代表了与文档管理的各个样式表. 每个样式表 都由一个CSSStyleS ...

  7. Hadoop技术内幕(YARN)第4章问题部分答案

    问题1:改写DistributedShell程序,使得每个container运行在不同节点上(目前是随机的,可能运行在任意节点上). 问题2:改写DistributedShell程序,使得某个用户指定 ...

  8. Android 设计模式一:EIT造型

    前言:首先不提造型,我们先来学习公式. 思绪回到于十七世纪中,牛顿提出了简单公式:F=ma:让人们能轻易理解物体运动的复杂<关系>. 再如,于二十世纪初,爱因斯坦发表了简单公式:E=MC平 ...

  9. iOS 中 CAShapeLayer 的使用( 等待删除的博文)

    等待删除. 1.CAShapeLayer 简介 1.CAShapeLayer继承至CALayer,可以使用CALayer的所有属性值 2.CAShapeLayer需要与贝塞尔曲线配合使用才有意义 3. ...

  10. 忙碌的Nova君 (活动安排问题、贪心算法)

    题目描述 理论上,Nova君是个大闲人,但每天还是有一大堆事要干,大作业啦,创新杯啦,游戏啦,出题坑人啦,balabala......然而精力有限,Nova君同一时间只能做一件事,并不能一心二用.假设 ...