最近需要做个无重随机序列,无奈小弟不给力,在网上找了半天,找到一个还是效率不高,后来我提供了算法思路——完全剩余系,无奈小弟能力有限无法实现,最终还是得自己忙里抽空自己写了一个。后来发现效率还可以,特发出来请大家指点一下~
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通过`Random`或`SecureRandom`类可以方便地生成随机序列码,满足各种应用场景。在设计和实现过程中,应考虑性能、安全性和可扩展性等因素,以适应不同业务需求。在提供的压缩包文件"序列码"中,可能...
本文详细分析了如何使用Java生成1至100之间的随机整数,并特别聚焦于识别和输出那些连续出现次数超过指定次数的数字序列。通过理解代码中的随机数生成、避免重复数字以及条件输出机制,开发者可以更好地掌握Java中的...
### Java生成N位随机序列详解 #### 一、概述 在Java编程中,有时我们需要生成一个特定长度(N位)的随机序列。这样的序列可以用于多种应用场景,比如密码学中的密钥生成、抽奖系统的随机选号等。本文将详细介绍...
生成随机汉字时,需要确定字符集范围。 2. **随机码生成**:这通常涉及到使用伪随机数生成器(PRNG),如Mersenne Twister,或者在现代编程语言中内置的random库。通过设定种子值,可以确保每次生成的序列都是可...
在 Eclipse 中,可以使用固定的 1L 或随机生成的 long 类型数据作为序列化 ID。如果没有特殊需求,可以使用默认的 1L,这样可以确保代码一致时反序列化成功。 静态变量序列化 ---------------- 在 Java 序列化中,...
1. **生成随机字符串**:使用`Random`类或者更安全的`SecureRandom`类生成随机数字和字母的组合。可以设置字符串长度,字符集(包括大小写字母和数字)。 2. **绘制验证码图像**:使用Java的`Graphics2D` API在`...
首先,我们可以使用`java.util.Random`类来生成随机整数或浮点数。`Random`类是Java内置的随机数生成器,可以生成0到最大值(包括0但不包括最大值)之间的随机数。例如,要生成一个1到100之间的随机整数,可以这样做...
JAVA中的`Random`和`SecureRandom`都属于伪随机数生成器,它们基于确定性的算法生成看似随机的序列。这些序列是周期性的,但周期非常长,对于大多数应用来说足够“随机”。而真随机数生成器则依赖于物理现象,如电子...
2022-09-19 V1.5 修改了一些BUG, ...1. 十六进制序列.exe 为本人自行编写,如有其它需求请联系! 2. 输入十六进制起始号、终止号,自动列出之间序列号弹出Excel表显示; 3. 可在序列号前、后增加其它文本;
5. **安全性评估**:为了保证生成的伪随机序列在密码学上的安全性,需要对其进行各种统计测试,如NIST的Statistical Test Suite,以验证其不可区分性于真正的随机数。 在密码学中,序列密码是一种使用伪随机数生成...
在讨论Java编程中的伪随机数生成时,首先应该了解“伪随机数”的概念。伪随机数是由算法生成的数列,尽管它们看起来像是随机的,但实际上是由一个确定的算法决定的,可以重复生成,这与物理过程生成的真随机数有所...
在这个项目中,验证码可能是通过随机生成的字符序列,然后绘制到图片上实现的。这可能涉及到Java的`java.awt`和`javax.imageio`包,用于创建和操作图像。 - 用户点击验证码图片可以刷新验证码,这可能通过重置...
有时候会需要将一个ArrayList或者数组中的数字打乱,方便后续使用,比如随机出题、答案选项打乱、连线题打乱、抽奖号码打乱等等,把我自己写的一段代码贴出来分享给大家。
其中一个著名的类是`SequentialGenerator`,它能够生成递增的序列ID。虽然默认生成的是十进制的整数,但通过转换可以得到16进制的表示,满足32位的需求。例如,可以创建一个`SequentialGenerator`实例,并设置适当的...
在这个游戏中,玩家需要在一个4x4的网格上滑动数字方块,每次操作会新生成一个随机的2或者4,相同数字的方块在相遇时会合并成它们的和,目标是通过不断的合并最终得到2048这个数字。这个游戏不仅锻炼玩家的策略思维...
在Java编程语言中,生成随机数是...在设计验证码或订单编号系统时,我们可以结合时间戳和其他随机成分来确保生成序列的独特性和安全性。通过适当调整参数,可以轻松地生成4位至36位的随机数,满足各种应用场景的需求。
2. **随机字符生成**:可以使用`java.util.Random`类生成随机的字母和数字。为了增加安全性,通常会混合大小写字母和数字,并确保生成的字符串具有指定的长度。 3. **文字渲染**:在`Graphics2D`对象上绘制文本时,...
Java数据结构和算法是计算机科学中的核心组成部分,它们在编程中扮演着至关重要的角色,能够帮助我们编写出高效、优化的代码。"Algorithm-java-ds-algorithms.zip"这个压缩包很可能包含了各种用Java实现的数据结构和...
5. **随机数生成**:赌博游戏通常涉及随机事件,Java的`Random`类可以用于生成各种随机数,模拟骰子掷出的点数、卡片的抽取等。 6. **异常处理**:在处理用户输入和游戏规则时,需要预防和处理可能出现的错误,如...
默认情况下,`Random`类使用系统当前时间作为种子,确保每次运行程序时生成不同的随机序列。 3. **生成随机数**:`int tmp = rand.nextInt(32) + 1;` 这是核心代码,它调用了`Random`类的`nextInt`方法,参数32指定...