Flutter/Dart:如何确保减法随机生成的第一个数值大于第二个?
解决算术测验APP的减法负数与除法整数结果问题
一、减法避免负数结果
要确保减法中第一个数大于等于第二个数,调整随机数生成逻辑:先生成第二个数val2,再让val1在val2到设定的range1范围内随机取值,保证val1 >= val2。
二、除法保证整数结果
除法要得到整数,需让val1是val2的整数倍。先生成val2,再随机生成一个合法倍数(确保val1 = val2 * 倍数不超过range1),这样val1 / val2的结果必然是整数。
修改后的完整代码
List<dynamic> questions = []; List<dynamic> answers = []; bool isMarked = false; List<List<dynamic>> mcq = []; List<dynamic> userAnswer = []; List<dynamic> ansData = []; List<dynamic> ans = []; var j = 0; final CountDownController _controller = CountDownController(); @override void initState() { super.initState(); for (var i = 1; i < int.parse(widget.numOfQuestions) + 1; i++) { ans = []; int val1, val2; final range1 = int.parse(widget.range1); final range2 = int.parse(widget.range2); if (widget.operator == 'sum') { val1 = Random().nextInt(range1) + 1; val2 = Random().nextInt(range2) + 1; questions.add('$val1 + $val2 = ? '); answers.add(val1 + val2); ansData = [ val1 + val2, val1 + val2 + Random().nextInt(10) + 1, val1 + val2 - Random().nextInt(10) - 1, val1 + val2 + Random().nextInt(16) + 1, ]; } else if (widget.operator == 'minus') { // 减法:保证val1 >= val2 val2 = Random().nextInt(range2) + 1; // val1的取值范围是val2到range1,计算可用区间长度后生成随机数 val1 = Random().nextInt(range1 - val2 + 1) + val2; questions.add('$val1 - $val2 = ? '); answers.add(val1 - val2); ansData = [ val1 - val2, val1 - val2 + Random().nextInt(10) + 1, val1 - val2 - Random().nextInt(10) - 1, val1 - val2 + Random().nextInt(16) + 1, ]; } else if (widget.operator == 'multiplication') { val1 = Random().nextInt(range1) + 1; val2 = Random().nextInt(range2) + 1; questions.add('$val1 * $val2 = ? '); answers.add(val1 * val2); ansData = [ val1 * val2, val1 * val2 + Random().nextInt(10) + 1, val1 * val2 - Random().nextInt(10) - 1, val1 * val2 + Random().nextInt(20) + 1, ]; } else { // 除法:保证结果为整数,val1是val2的倍数 val2 = Random().nextInt(range2) + 1; // 计算最大允许的倍数,避免val1超过range1 int maxMultiple = range1 ~/ val2; // 确保至少有1倍的可能(防止val2大于range1的情况) if (maxMultiple < 1) maxMultiple = 1; int multiple = Random().nextInt(maxMultiple) + 1; val1 = val2 * multiple; questions.add('$val1 / $val2 = ? '); answers.add(val1 ~/ val2); // 用整数除法得到整数结果 ansData = [ val1 ~/ val2, val1 ~/ val2 + Random().nextInt(10) + 1, val1 ~/ val2 - Random().nextInt(10) - 1, val1 ~/ val2 + Random().nextInt(16) + 1, ]; } // 打乱选项逻辑保持不变 for (var j = 0; j < 4; j++) { final rNum = Random().nextInt(ansData.length); ans.add(ansData[rNum]); ansData.removeAt(rNum); } mcq.add(ans); } }
关键修改说明
- 减法逻辑:调整
val1的生成范围,确保其始终大于等于val2,彻底消除负数结果。 - 除法逻辑:通过倍数关系生成
val1,保证除法结果为整数,同时将答案和选项改为整数格式,更贴合儿童算术学习场景。 - 提取
range1和range2的解析结果,避免重复类型转换,提升代码可读性。
内容的提问来源于stack exchange,提问作者sulli110
相关产品推荐
相关产品推荐

