Java - 使用预设答案生成随机表达式

时间:2015-11-29 03:50:05

标签: java

我制作的Android应用会执行以下操作:

  • 生成随机数(1-9)并保存
  • 生成表达式,其答案是上一步
  • 显示表达式和" numpad"数字从1到9就可以了
  • 等待用户按下numpad上的其中一个按钮并检查它是否正确
  • 如果用户选择了错误的答案,则生成与之前相同的新表达式(步骤2)
  • 如果用户选择了正确答案,请转到步骤1

所以现在我正在创建一个生成表达式的方法:

public class Main {

    public static void main(String[] args) {
        Random rnd = new Random();

        int number = rnd.nextInt(9) + 1;
        String example = expressionGeneration(number);

        System.out.println(example);

    }

    private static String expressionGeneration(int a) {
        StringBuilder sb = new StringBuilder(50);
        Random rnd = new Random();
        char op = '$'; // to make it initialized and recognize mistakes
        int x;
        double y = 0.5;

        do {
            int choice = rnd.nextInt(7);
            x = rnd.nextInt(100);
            switch (choice) {
            case 0:
                y = a + x;
                op = '-';
                break;
            case 1:
                y = a - x;
                op = '+';
                break;
            case 2:
                y = a * x;
                op = '/';
                break;
            case 3:
                x = rnd.nextInt(99) + 1;
                y = a / x;
                op = '*';
                break;
            case 4:
                y = Math.pow(a, 2); // will be changed later to display the result right
                op = '√';
                break;
            case 5:
                if (Math.sqrt(a) % 1 == 0) {
                    y = Math.sqrt(a);
                    op = '^';
                    x = 2;
                }
                break;
            case 6:         //it's a joke   
                if (x == 33) {
                    return "33";
                }
                y = 0.5;    //to regenerate if (x != 33)
                break;
            }
        } while ((int) y != y); //to check if y is integer and if no - regenerate

        sb.append((int) y + "" + op + "" + x + "=" + a); // answer here is just for testing

        return sb.toString();
    }
}

大多数情况下,它完全符合我的需要,例如:" -8 + 11 = 3",但有时会给出类似这样的例子:

  1. 0 $ 92 = 3
  2. 0 * 40 = 8
  3. 我认为这意味着乘法不能正常工作,在某些情况下,op和y不会在循环中初始化,但它怎么可能? 或者也许你可以建议任何其他算法在我的情况下。

    所以我的问题是:我做错了什么,还有其他方法可以做我需要的吗?

    由于

1 个答案:

答案 0 :(得分:1)

使用两个整数除/时,结果将始终为整数,即使存储结果的变量为double。要解决此问题,您需要明确说明除法中的一个数字是double

case 3:
    x = rnd.nextInt(99) + 1;
    y = a / (double) x;
    op = '*';
    break;