最近需要做个无重随机序列,无奈小弟不给力,在网上找了半天,找到一个还是效率不高,后来我提供了算法思路——完全剩余系,无奈小弟能力有限无法实现,最终还是得自己忙里抽空自己写了一个。后来发现效率还可以,特发出来请大家指点一下~
package new2.com.other; import java.util.ArrayList; import java.util.Random; /** * 生成一个整型无重随机序列,无参构造使用数组序列生成,有参构造使用完全剩余系定理(效率高,包含生成质数序列) */ public class UniqueRandom { int maxValue; ArrayList<Integer> prime_num = new ArrayList<Integer>();// 质数序列用于查找\判断质数用 Random rd = new Random(); boolean isPrimeModel = false; UniqueRandom() { } UniqueRandom(int maxValue) { this.maxValue = maxValue + 1; createPrimeList(); isPrimeModel = true; // for(Integer pm:prime_num)System.out.print(pm+","); } private int sqrt(int value) { return (int) Math.ceil(Math.sqrt(new Integer(value).doubleValue())); } private void createPrimeList() { prime_num.add(2); prime_num.add(3); if (maxValue < 5) return; for (int i = 5; i < maxValue; i = i + 2) { int sqrt = sqrt(i); boolean isPrime = true; for (Integer pm : prime_num) { if (!isPrime || pm > sqrt) break; isPrime = i % pm != 0; } if (isPrime) prime_num.add(i); } } private int primeNumWith(int size) { while (true) { int pn = prime_num.get(rd.nextInt(prime_num.size()));// 随机点2 if (pn < size && size % pn == 0) continue; return pn; } } public int[] randomList(int count, int size) { int[] result = new int[count]; if (isPrimeModel) { if (size >= maxValue) { System.out.println("size Out of range! The maxValue is:" + maxValue); return null; } int rdn_prm_num_for_size = primeNumWith(size); int initpos = (size == count) ? 0 : rd.nextInt(size - count);// 随机点1 for (int i = 0; i < count; i++) result[i] = (int) ((initpos + i) * (long) rdn_prm_num_for_size % size); } else { return getRandomSequence2(size, count); } return result; } private int[] getRandomSequence2(int maxNum, int arrSize) { int[] sequence = new int[maxNum]; for (int i = 0; i < maxNum; i++) sequence[i] = i; int[] output = new int[arrSize]; int end = maxNum - 1; for (int i = 0; i < arrSize; i++) { int num = rd.nextInt(end + 1); output[i] = sequence[num]; sequence[num] = sequence[end]; end--; } return output; } public static void main(String[] args) { int rate = 1000; int MAX = 1000 * rate; int SIZE = 1000 * rate; int NEED = 1000 * rate; UniqueRandom ur = new UniqueRandom(MAX); long start = System.nanoTime(); int[] result = ur.randomList(NEED, SIZE); System.out.println(System.nanoTime() - start); for(int i:result) System.out.print(i+","); } }
其中整合了小弟在网上找的算法——利用数组,个人感觉还不错,特别一同整合进去了。
个人的算法思路就是利用完全剩余系定理。其中生成小于N的质数序列比较费时,建议使用的时候预先初始化一下~质数序列其实用处就是为了做一个互质的数而已……O(∩_∩)O~
个人算法方面其实挺弱的,还请各位大牛指点,再优化一下,多谢~~
可以和之前的博客比较一下:http://lfl2011.iteye.com/blog/1523862
原文:http://my.oschina.net/alvinte/blog/111225
相关推荐
用java语言编写的产生一个N位随机序列的代码
随机生成序列码的java代码,可以指定字符格式和字符位数
2022-09-19 V1.5 修改了一些BUG, ...1. 十六进制序列.exe 为本人自行编写,如有其它需求请联系! 2. 输入十六进制起始号、终止号,自动列出之间序列号弹出Excel表显示; 3. 可在序列号前、后增加其它文本;
有时候会需要将一个ArrayList或者数组中的数字打乱,方便后续使用,比如随机出题、答案选项打乱、连线题打乱、抽奖号码打乱等等,把我自己写的一段代码贴出来分享给大家。
java 不重复的随机数序列 java 不重复的随机数序列
我是我自己写的一个工具类,打了包,里面含有源文件,可根据需要产生指定长度的大写或者小写或者大小写均有,或者纯数字,或者数字字符具有,以及产生唯一字符序列的串方法。
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
JVM/基准的静态加载时随机生成有效载荷; 种子也跨运行共享 从 RAM 中读取数据 将数据写入可重用的输出流(如果可能); 这减少了分配压力 消耗所有输出流; 避免死代码消除优化 未评估的是:RAM 利用率、压缩、有效...
应用洗牌算法生成随机序列,制作一个键位随机的输入键盘
自己写的一个随机生成,通过置换加密后的密码学序列码生成程序,技术有java、javaswing,界面的响应事件很清晰。
构建一个Arduino硬件随机数生成器并从Java使用它
aes java源码java-aes-crypto 这个 AES 库非常简单,仅适用于 Android。 对于跨平台加密系统,请使用 ...处理:我们在每次加密之前安全地生成一个随机 IV,并提供一个简单的类来将 IV 和密文保存在一起,以便它们易
随机生成资源种类 资源数 输出安全序列 检测安全状态
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
constructNoPara.java 无参数的构造方法 constructWithPara.java 带参数的构造方法 declareDefault.java 缺省访问权限的使用 declarePrivate.java 私有访问权限的使用 declareProtected.java 保护访问权限的...
是一个库,可帮助您从伪随机数生成器 (PRNG) 及其种子源中获得最佳性能和最佳伪随机性。 有了它,您可以: 将具有改进的速度和随机性测试性能的SplittableRandom包装为java.util.Random以便像这样的方法可以使用它。...
“加密序列”是一种库,它允许人们生成伪随机数,这些伪随机数也保证是唯一的。 为什么 例如,这对于生成对用户可见的唯一标识符很有用,但不会泄漏有关到目前为止已生成的标识符数量,给定标识符是否已在另一个...
Java图形化界面实现以下要求,我上传给大家一同分享。 通过随机数产生一个指令序列,共 320 条指令,指令的地址按下述原则生成: (1):在[0,319]的指令地址之间随机选取一起点 m。 (2):顺序执行一条指令,...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...