You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 第一次生成myInt=3,遍历到i=0时发现重复,进入while生成新的myInt=5
  2. 循环继续到i=1,发现5和repeatArray[1]重复,又生成新的myInt=3
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:07:01