开发多选择题应用:使用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实例,可能因为系统时钟种子重复导致生成相同随机数,不过当前核心问题是没使用随机数选题目。
修复方案
- 用随机数索引获取题目:用
rnd.Next(count)生成的随机索引去从lines里取对应的行,替代固定取最后一行的逻辑。 - 优化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
相关产品推荐
相关产品推荐

