Android Studio中Java如何生成可整除的1-100随机整数
实现方案说明
现存代码的问题梳理
- 随机数生成环节没有合法性校验,遇到无整除关系的数对(比如17和11)时,后续逻辑会生成空题目,直接设置给TextView会触发空指针崩溃
- 整除判断逻辑漏了两数相等的合法场景(比如
11 ÷ 11 = ?),原有判断只判断了两数不等的情况 findResult里的语法错误很常见:else if后面误用了左花括号,正确格式是用小括号包裹判断条件- 没有无效数对的处理逻辑,一旦随机结果不满足要求就直接返回空值
两种可落地的实现思路
思路1:正向构造法(优先使用)
这个方法从根源上规避不合法数对,不需要循环,也不用额外做整除判断,对新手更友好。
核心流程:
- 先生成1-100范围内的随机除数
- 计算该除数下的最大可用商:因为被除数必须≤100,所以最大商为
100 / 除数(整数除法自动向下取整) - 在1到最大商的范围内随机生成商值
- 按「被除数 = 除数 × 商」计算被除数,天生满足所有要求:
- 乘积是除数的整数倍,必然能整除
- 商最小为1,乘积最小等于除数本身,满足被除数≥除数的要求
- 所有数值都在1-100的取值范围内
替换onCreate里的随机数生成代码示例:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Objects.requireNonNull(getSupportActionBar()).hide(); setContentView(R.layout.activity_division); // 正向构造合法的除法数对 int divisor = (int) (Math.random() * 100 + 1); // 随机生成除数,范围1-100 int maxQuotient = 100 / divisor; // 计算最大可支持的商,保证除数*商 ≤100 int quotient = (int) (Math.random() * maxQuotient + 1); // 随机生成1~maxQuotient范围内的商 int dividend = divisor * quotient; // 计算被除数,天生满足整除、大小关系要求 // 赋值给原有全局变量即可,和之前的代码结构完全兼容 randomFirstNum = dividend; randomSecondNum = divisor; // 调用后续的题目生成、结果计算方法 generateQuestion(randomFirstNum, randomSecondNum); int result = findResult(randomFirstNum, randomSecondNum); }
思路2:循环重试法
如果你更习惯之前「随机两个数、校验合法性」的思路,可以加循环逻辑,直到拿到符合要求的数对为止:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Objects.requireNonNull(getSupportActionBar()).hide(); setContentView(R.layout.activity_division); int dividend, divisor; // 循环随机直到拿到合法数对 do { int num1 = (int) (Math.random() * 100 + 1); int num2 = (int) (Math.random() * 100 + 1); // 把较大的数作为候选被除数,较小的作为候选除数 dividend = Math.max(num1, num2); divisor = Math.min(num1, num2); // 只要不能整除就继续循环 } while (dividend % divisor != 0); randomFirstNum = dividend; randomSecondNum = divisor; generateQuestion(randomFirstNum, randomSecondNum); int result = findResult(randomFirstNum, randomSecondNum); }
修正后的功能方法
因为传入的两个参数已经是完全合法的被除数、除数,原有方法里的复杂分支判断可以全部删掉,也不会出现空值问题:
generateQuestion 修正版本
private void generateQuestion(int dividend, int divisor) { String question = dividend + " ÷ " + divisor + " = ?"; textViewQuestion.setText(question); }
findResult 修正版本
private int findResult(int dividend, int divisor) { // 已经保证是整除关系,直接计算结果即可 return dividend / divisor; }
内容的提问来源于stack exchange,提问作者Confused Superman
相关产品推荐
相关产品推荐

