Android应用中使用循环避免随机数重复问题排查
问题分析与修复方案
我帮你分析下代码里的问题,其实是两处逻辑漏洞导致重复值出现的:
核心问题1:重复检查的范围错误
当contRep为1时,数组里只有repeatArray[0]是有效的已生成ID,repeatArray[1]到repeatArray[4]都是默认的0(而你的随机数是1-26,不会等于0),但你却遍历了整个数组长度。更关键的是,当contRep增大时,你应该只检查已经存入过值的元素(也就是索引从0到contRep-1的部分),而不是整个数组——遍历未使用的数组位置完全是无用功,还会干扰逻辑判断。
核心问题2:重复检查的逻辑不完整
当前代码中,当你在遍历某个索引i时发现myInt重复,会重新生成myInt,但生成后并没有从头开始重新检查所有已有的元素,而是继续遍历剩下的i。举个实际例子:
假设repeatArray已经存入[3,5],现在要生成第三个ID:
- 第一次生成
myInt=3,遍历到i=0时发现重复,进入while生成新的myInt=5 - 循环继续到
i=1,发现5和repeatArray[1]重复,又生成新的myInt=3 - 此时循环已遍历完所有
i,直接把3存入数组,导致和repeatArray[0]重复
因为你只检查了当前i的位置,没有重新校验前面的元素,所以漏判了重复情况。
修复方案1:修正现有循环逻辑
把重复检查改成:每次生成myInt后,校验它是否存在于数组的已使用部分,若重复则重新生成,直到得到不重复的值:
int[] repeatArray = new int[5]; Integer contRep = 0; Integer myInt = 0; Random r = new Random(); // 注意:必须初始化Random实例,原代码未体现这一步,会导致空指针 // Activity启动时生成第一个ID randomizeData(); repeatArray[0] = myInt; contRep = 1; // 按钮点击事件逻辑 public void onGenerateBtnClick(View view) { if (contRep >= 5) { // 已生成5个ID,停止生成 return; } boolean isDuplicate; do { randomizeData(); isDuplicate = false; // 只检查已经存入的元素(0到contRep-1) for (int i = 0; i < contRep; i++) { if (myInt == repeatArray[i]) { isDuplicate = true; break; // 发现重复,跳出循环重新生成 } } } while (isDuplicate); // 存入不重复的ID repeatArray[contRep] = myInt; contRep++; } public void randomizeData() { myInt = r.nextInt(26) + 1; // 等价于r.nextInt(27-1)+1,写法更简洁 }
修复方案2:用Set简化逻辑(更推荐)
Set集合天然不允许重复元素,用它来存储已生成的ID,能彻底避免手动循环的逻辑漏洞:
LinkedHashSet<Integer> generatedIds = new LinkedHashSet<>(); Random r = new Random(); int[] repeatArray = new int[5]; int contRep = 0; // Activity启动时生成第一个ID generateUniqueId(); repeatArray[0] = new ArrayList<>(generatedIds).get(0); contRep = 1; // 按钮点击事件逻辑 public void onGenerateBtnClick(View view) { if (contRep >= 5) { return; } generateUniqueId(); // 按插入顺序取出最新生成的ID存入数组 repeatArray[contRep] = new ArrayList<>(generatedIds).get(contRep); contRep++; } private void generateUniqueId() { int newId; // add方法返回false说明元素已存在,继续循环生成新值 do { newId = r.nextInt(26) + 1; } while (!generatedIds.add(newId)); }
内容的提问来源于stack exchange,提问作者Erphisha
相关产品推荐
相关产品推荐

