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

从文本文件生成随机单词时每次返回组合固定不变的问题求助

问题根因&修复方案

1. 随机数取值范围错误

你当前使用的ThreadLocalRandom.current().nextInt(0, size - 1)存在参数错误:
ThreadLocalRandom的nextInt(origin, bound)方法是左闭右开规则,即生成的随机数包含origin、不包含bound。你传入size - 1作为bound,会永远取不到数组最后一个元素,正确写法应该是nextInt(0, size)。

2. 文件读取逻辑不严谨

InputStream.available()返回的是当前可无阻塞读取的字节数预估,不是文件的总大小,直接用这个值作为缓冲区大小很容易出现读取不完整的问题,导致拆分出来的单词数组始终是截断后的固定内容。同时如果你的words.txt是在Windows系统下编写的,换行符是\r\n,用split("\n")拆分后每个单词末尾会残留\r字符,容易出现不同下标对应字符串内容相同的问题。
修正后的完整代码如下:

public void correct_button(View view) {
    StringBuilder textBuilder = new StringBuilder();
    try (InputStream is = getAssets().open("words.txt");
         BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
        String line;
        // 逐行读取直接规避换行符兼容问题
        while ((line = reader.readLine()) != null) {
            textBuilder.append(line).append("\n");
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    String[] separated = textBuilder.toString().split("\n");
    int size = separated.length;
    // 修正随机数范围
    int randomNum = ThreadLocalRandom.current().nextInt(0, size);
    String randomWord = separated[randomNum];
    // 注意:此处需要把randomWord赋值给全局变量/更新到UI控件,否则局部变量不会生效
}

3. 局部变量未生效问题

你当前代码里的randomWord是方法内部的局部变量,方法执行结束后就会被回收,如果你没有把这个值赋值给全局变量、或者更新到界面显示的控件上,会出现界面上的单词始终不变的错觉。


优化建议

可以把单词数组缓存为全局变量,避免每次点击按钮都重复读取assets文件,提升性能:

// 全局变量缓存单词数组
private String[] wordArray;

// 在onCreate等初始化方法里提前读取一次即可
private void initWordArray() {
    List<String> wordList = new ArrayList<>();
    try (InputStream is = getAssets().open("words.txt");
         BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
        String line;
        while ((line = reader.readLine()) != null) {
            // 过滤空行
            if (!line.trim().isEmpty()) {
                wordList.add(line.trim());
            }
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    wordArray = wordList.toArray(new String[0]);
}

public void correct_button(View view) {
    if (wordArray == null || wordArray.length == 0) {
        return;
    }
    int randomNum = ThreadLocalRandom.current().nextInt(0, wordArray.length);
    String randomWord = wordArray[randomNum];
    // 后续更新UI逻辑
}

内容的提问来源于stack exchange,提问作者user16240688

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:09:02