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

开发多选择题应用:使用Random类仍出现首次加载同题的问题求助

解决WinForms随机出题首次加载固定的问题

先看你的问题描述和代码:

我正在开发一款多选择题应用,该应用从文本文件中读取题目及选项,期望实现随机出题功能。目前代码可正常运行,但每次首次加载应用时,始终显示同一道题目,即便已使用Random类也无法解决该问题。

你的代码:

private void Form1_Load(object sender, EventArgs e) { 
    string filePath = @"C:\Users\User\Documents\flower.txt"; 
    List<string> lines = File.ReadAllLines(filePath).ToList(); 
    int count = lines.Count(); 
    Random rnd = new Random(); 
    //label1.Text = rnd.Next().ToString(); 
    QuestionsWithAnswer qtn = new QuestionsWithAnswer(); 
    string[] line = lines[count - 1].Split(','); 
    lblQuestion.Text = qtn.question1 = line[0]; 
    radOpt1.Text = qtn.opt1 = line[1]; 
    radOpt2.Text = qtn.opt2 = line[2]; 
    radOpt3.Text = qtn.opt3 = line[3]; 
    radOpt4.Text = qtn.opt4 = line[4]; 
    radOpt5.Text = qtn.opt5 = line[5]; 
    radOpt4.Checked = true; 
    label1.Text = rnd.Next(count).ToString(); 
}

问题根源

你虽然创建了Random实例生成了随机数,但完全没用到这个随机数去选择题目!现在代码里固定取的是lines[count - 1]——也就是文本文件的最后一行题目,自然每次启动都显示同一道题。

另外还有个小隐患:如果后续加“下一题”按钮这类频繁调用随机数的功能,每次在方法内创建Random实例,可能因为系统时钟种子重复导致生成相同随机数,不过当前核心问题是没使用随机数选题目。

修复方案

  1. 用随机数索引获取题目:用rnd.Next(count)生成的随机索引去从lines里取对应的行,替代固定取最后一行的逻辑。
  2. 优化Random实例的创建:把Random声明为窗体的类成员,只初始化一次,避免短时间内重复创建导致的种子重复问题。

修改后的代码示例:

// 把Random声明为窗体类的成员,只初始化一次
private Random _rnd = new Random();

private void Form1_Load(object sender, EventArgs e) { 
    string filePath = @"C:\Users\User\Documents\flower.txt"; 
    List<string> lines = File.ReadAllLines(filePath).ToList(); 
    int count = lines.Count;
    
    // 先判断文件是否有题目,避免索引越界
    if (count == 0)
    {
        lblQuestion.Text = "没有找到题目";
        return;
    }
    
    // 生成随机索引,范围是0到count-1(Next(count)返回小于count的非负整数)
    int randomIndex = _rnd.Next(count);
    
    QuestionsWithAnswer qtn = new QuestionsWithAnswer(); 
    string[] line = lines[randomIndex].Split(','); 
    
    // 加个判断确保分割后的数组长度足够,避免索引越界
    if (line.Length >=6)
    {
        lblQuestion.Text = qtn.question1 = line[0]; 
        radOpt1.Text = qtn.opt1 = line[1]; 
        radOpt2.Text = qtn.opt2 = line[2]; 
        radOpt3.Text = qtn.opt3 = line[3]; 
        radOpt4.Text = qtn.opt4 = line[4]; 
        radOpt5.Text = qtn.opt5 = line[5]; 
    }
    else
    {
        lblQuestion.Text = "题目格式错误";
    }
    
    radOpt4.Checked = true; 
    label1.Text = randomIndex.ToString(); // 显示当前随机索引,方便调试
}

额外建议

  • 要保证文本文件里的每行题目格式正确,都是用逗号分隔的6个元素(题目+5个选项),不然容易出现索引越界错误。
  • 如果后续想实现“不重复出题”,可以把已经出过的题目索引存到一个集合里,每次生成随机数时跳过这些索引。

内容的提问来源于stack exchange,提问作者Ofodile JustCode Chukwubuikem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:36:45