知识点14:数组内存储1-100的不重复随机数问题
来源:互联网 发布:java分层命名规范 编辑:程序博客网 时间:2024/06/15 18:08
问题描述:在一个长度为100的数组里随机插入100个1-100内的随机数,要求随机数不能重复,并且不能使用其他类型的数据结构。仅可以使用数组完成。
解法1:
/** * 解题思路: * 随机生成1-100里面的数字z * . * 判断是否在数组里面存活 * 如果存活,则抛弃 * 如果不存活,添加进数组中 * 问题:效率不高 * 推荐指数:** * */ private static void putRandomNumberIntoArrays(int[] arrays) { int count =0; do { int randomNumber = new Random().nextInt(100)+1; if (!isAlive(randomNumber,arrays)) { arrays[count++] = randomNumber; } } while (!(count == arrays.length)); }/**判断是否存在*/ static boolean isAlive(int number,int[] arrays){ boolean isAlive = false; for (int i = 0; i < arrays.length; i++) { if (number == arrays[i]) { isAlive = true; } } return isAlive; }
这个解法应该是符合普遍人的思路了,只是这样的话会造成一个问题:当数组内的随机数越多的时候,重复的几率就会扩大,也就是需要生成更多的随机数,这使得效率十分低下,是故不推荐。但如果是在想不起其他优化的话,还是可以先参照的。下面是优化解法:
解法2:
/** * 解题思路: 在一长度为100数组中,依次存入1-100的数字 随机选取一个下标,将其存储的值与最后一个值交换 把数组的最后一个值加入到数组中,改变下一次随机下标取值范围(-1) 避免了重复数字的出现,避免了多次的循环判断监测,优化效率,但增加内存 * 推荐指数:*** * */ private static void putRandomNumberIntoArrays(int[] arrays) { int datalength=100; int[] data = new int[datalength]; for (int i = 0; i < data.length; i++) { data[i] = i+1; } int count = 0; do{ int rand =new Random().nextInt(datalength--); int tmp=data[rand]; data[rand] = data[datalength]; data[datalength] = tmp; arrays[count++] = data[datalength]; }while(count != arrays.length); }}
这个算法极大程度上优化了效率问题,但也增加了内存。虽然这个内存不算很致命。但总的来说,还有可以优化的地方。
解法3:
/** * 优化思路: 在数组内直接存放1-100的随机数,随机生成下标,将下标数值得数与可生成随机数的最大值进行交换,然后缩减随机数范围(-1) 既不新增内存,也优化了效率 * 推荐指数:**** * */ private static void putRandomNumberIntoArrays(int[] arrays) { int datalength =arrays.length; for (int i = 0; i < arrays.length; i++) { arrays[i]= i+1; } do{ int rand =new Random().nextInt(datalength--); int tmp=arrays[rand]; arrays[rand] = arrays[datalength]; arrays[datalength] = tmp; }while(datalength>0); }}
这个算法时目前所能想到的最佳的方法了,既不增加内存,也避免了随机值重复的问题。这个和解法2的问题仅限于是否增加一个内存而已,本质上是一致的,可供参考。
阅读全文
0 0
- 知识点14:数组内存储1-100的不重复随机数问题
- 生成1-100不重复的随机数
- C#1-100不重复的随机数
- 不重复随机数问题
- 使用HashSet存储10个1-20之间的随机数,并且要求随机数不重复。
- 不重复随机数的产生问题
- 产生一系列不重复随机数的问题
- C# 不重复随机数的产生问题
- 随机生成1000w内不重复的随机数
- C# Random对象短时间内产生不重复的随机数
- 不重复的随机数
- 不重复的随机数
- JAVA学习笔记(1)_区间内生成不重复的随机数
- 取随机数不重复问题
- 1-100不重复随机数的另一种思路
- 生成20个1-100不重复的随机数
- 产生100以内的不重复随机数
- C#生成100%不重复的随机数
- Spring实战笔记——Bean的高级装配
- 百练2806:公共子序列题解
- 12. 开发工具(make,makefile)
- python unicode转string
- 求树的最大独立集
- 知识点14:数组内存储1-100的不重复随机数问题
- json串的使用与操作
- Java内存的一点理解, 静态方法和实例方法的区别及使用场景
- Linux
- Codeforces Round #370 (Div. 2) C. Memory and De-Evolution(逆向思维)
- selenium+python自动化测试(四)--鼠标和键盘事件
- irqbalance对台式机/笔记本是否有帮助?
- 算法(一)最大子数组问题
- JS学习路线