随机序列生成算法---生成前N个整数的一组随机序列
2016-04-08 17:11
387 查看
问题描述:
给定输入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
而言,当随机生成第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]。
思路2:
先以1,2,3,.....N 初始化数组a
,然后随机选择一个数组下标,交换这两个下标处的值。
算法复杂度为O(N)
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
整个程序代码如下:
给定输入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
而言,当随机生成第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 ; 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
,然后随机选择一个数组下标,交换这两个下标处的值。
算法复杂度为O(N)
public static int[] algorithm3(int N){ int[] a = new int ; 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 ; 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 ; 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 ; 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); } }
相关文章推荐
- openssl 非对称加密算法DSA命令详解
- java使用部分字符串搜索文件
- LeetCode 238 -Product of Array Except Self ( JAVA )
- POJ2777_Count Color
- PHP用redis实现多进程队列
- [IOS 开发] GCD常用方法
- Objective-C简单的音乐播放器(边下边播)
- shader内置变量和函数
- zcat,zgrep用法
- 无向图的双连通性
- dede让channelartlist标签支持currentstyle属性 完美解决
- SpringMVC Controller介绍
- 纸牌博弈
- flask框架配置email问题汇总,包括163邮箱,qq邮箱,gmail等国内外邮箱
- C#-类的应用
- 升级java1.8及ssh版本中碰到的问题(四)
- 结构体对齐
- JSON需要的jar包和和String类型转JSON
- z-index不起作用原因
- 1007. Maximum Subsequence Sum