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

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);
  }
}

关键修改说明

  1. 减法逻辑:调整val1的生成范围,确保其始终大于等于val2,彻底消除负数结果。
  2. 除法逻辑:通过倍数关系生成val1,保证除法结果为整数,同时将答案和选项改为整数格式,更贴合儿童算术学习场景。
  3. 提取range1和range2的解析结果,避免重复类型转换,提升代码可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:20:26