`

java-生成无重随机序列

阅读更多

最近需要做个无重随机序列,无奈小弟不给力,在网上找了半天,找到一个还是效率不高,后来我提供了算法思路——完全剩余系,无奈小弟能力有限无法实现,最终还是得自己忙里抽空自己写了一个。后来发现效率还可以,特发出来请大家指点一下~

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语言编写的产生一个N位随机序列的代码

    随机生成序列码

    随机生成序列码的java代码,可以指定字符格式和字符位数

    十六进制自动生成工具软件

    2022-09-19 V1.5 修改了一些BUG, ...1. 十六进制序列.exe 为本人自行编写,如有其它需求请联系! 2. 输入十六进制起始号、终止号,自动列出之间序列号弹出Excel表显示; 3. 可在序列号前、后增加其它文本;

    Java打乱ArrayList生成一个随机序列列表

    有时候会需要将一个ArrayList或者数组中的数字打乱,方便后续使用,比如随机出题、答案选项打乱、连线题打乱、抽奖号码打乱等等,把我自己写的一段代码贴出来分享给大家。

    java 不重复的随机数序列

    java 不重复的随机数序列 java 不重复的随机数序列

    java产生随即字符串和唯一序列串等得工具包

    我是我自己写的一个工具类,打了包,里面含有源文件,可根据需要产生指定长度的大写或者小写或者大小写均有,或者纯数字,或者数字字符具有,以及产生唯一字符序列的串方法。

    java源码包---java 源码 大量 实例

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java笔试题输出结果-java-json-benchmark:JavaJSON库序列化和反序列化的性能测试

    JVM/基准的静态加载时随机生成有效载荷; 种子也跨运行共享 从 RAM 中读取数据 将数据写入可重用的输出流(如果可能); 这减少了分配压力 消耗所有输出流; 避免死代码消除优化 未评估的是:RAM 利用率、压缩、有效...

    基于JAVA的随机键盘

    应用洗牌算法生成随机序列,制作一个键位随机的输入键盘

    密码学序列码生成.java

    自己写的一个随机生成,通过置换加密后的密码学序列码生成程序,技术有java、javaswing,界面的响应事件很清晰。

    具有Java接口的Arduino硬件随机序列生成器

    构建一个Arduino硬件随机数生成器并从Java使用它

    aesjava源码-java-aes-crypto:用于加密和解密字符串的简单Android类,旨在避免大多数此类类所遭受的经典错误

    aes java源码java-aes-crypto 这个 AES 库非常简单,仅适用于 Android。 对于跨平台加密系统,请使用 ...处理:我们在每次加密之前安全地生成一个随机 IV,并提供一个简单的类来将 IV 和密文保存在一起,以便它们易

    java实现银行家算法

    随机生成资源种类 资源数 输出安全序列 检测安全状态

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    Java开发技术大全(500个源代码).

    constructNoPara.java 无参数的构造方法 constructWithPara.java 带参数的构造方法 declareDefault.java 缺省访问权限的使用 declarePrivate.java 私有访问权限的使用 declareProtected.java 保护访问权限的...

    java8stream源码-BetterRandom:更好的Java随机数生成。Java文档:

    是一个库,可帮助您从伪随机数生成器 (PRNG) 及其种子源中获得最佳性能和最佳伪随机性。 有了它,您可以: 将具有改进的速度和随机性测试性能的SplittableRandom包装为java.util.Random以便像这样的方法可以使用它。...

    cryptic-sequences:一个允许生成伪随机数的库,伪随机数也保证是唯一的

    “加密序列”是一种库,它允许人们生成伪随机数,这些伪随机数也保证是唯一的。 为什么 例如,这对于生成对用户可见的唯一标识符很有用,但不会泄漏有关到目前为止已生成的标识符数量,给定标识符是否已在另一个...

    Java 模拟操作系统页面替换算法

    Java图形化界面实现以下要求,我上传给大家一同分享。 通过随机数产生一个指令序列,共 320 条指令,指令的地址按下述原则生成: (1):在[0,319]的指令地址之间随机选取一起点 m。 (2):顺序执行一条指令,...

    java源码包4

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

Global site tag (gtag.js) - Google Analytics