随机数学生成算法不工作



注意问题的标题是:

Random math question generation algorithm not working

因为我不能在题目中输入"question"…


所以我正在写一个android应用程序,通过给孩子们数学问题来帮助他们学习数学。他们可以随心所欲地更改位数和操作类型。我现在对我写的生成随机问题的算法感到困惑。它每次都用相同的问题选项生成相同的问题。选项

number of digits: 1
operation: +

总是10 + 10。

选择

问题

number of digits: 2
operation: +

总是11 + 11。

选择

问题

number of digits: 3
operation: +

总是8 + 8。

选择

问题

number of digits: 2
operation: +

总是11 + 11。

虽然其他操作类型(-,+/-,*)更随机一些,但它的一个操作数总是相同的。1位是10,2位是11,3位是8。

现在是我的算法:

public void generateAQuestion () {
    switch (options.getOperationType ()) {
        case ADDITION:
            current = generateAddition ();
            break;
        case SUBTRACTION:
            current = generateSubtraction ();
            break;
        case ADD_AND_SUB:
            current = generateAddAndSub ();
            break;
        case MULTIPLICATION:
            current = generateMultiplication ();;
            break;
    }
}
private int generateNumberWithDigitCount () {
    int minValue = 10 ^ (options.getDigitCount () - 1);
    int maxValue = 10 ^ options.getDigitCount () - 1;
    Random r = new Random ();
    return r.nextInt (maxValue - minValue + 1) + minValue;
}
private Question generateAddition () {
    int operand1, operand2;
    operand1 = generateNumberWithDigitCount ();
    operand2 = generateNumberWithDigitCount ();
    return new Question (operand1, operand2);
}
private Question generateSubtraction () {
    int operand1 = generateNumberWithDigitCount ();
    Random r = new Random ();
    int operand2 = -(r.nextInt (operand1));
    return new Question (operand1, operand2);
}
private Question generateAddAndSub () {
    Question firstPart;
    if (Math.random () > 0.5) {
        firstPart = generateAddition ();
    } else {
        firstPart = generateSubtraction ();
    }
    int[] operands = new int[3];
    operands[0] = firstPart.getOperands ()[0];
    operands[1] = firstPart.getOperands ()[1];
    if (Math.random () > 0.5) {
        Random r = new Random ();
        operands[2] = -(r.nextInt (firstPart.getAnswer ()));
    } else {
        operands[2] = generateNumberWithDigitCount ();
    }
    return new Question (operands);
}
private MultiplicationQuestion generateMultiplication () {
    return new MultiplicationQuestion (generateNumberWithDigitCount (), generateNumberWithDigitCount ());
}
private int[] generateAnswers (int correctAnswer) {
    int[] answers = new int[4];
    Random r = new Random ();
    int correctAnswerIndex = r.nextInt (4);
    answers[correctAnswerIndex] = correctAnswer;
    for (int i = 0 ; i < answers.length ; i++) {
        if (i == correctAnswerIndex) {
            continue;
        }
        if (Math.random () > 0.5) {
            answers[i] = correctAnswer + (i + 1);
        } else {
            int candidate = correctAnswer - (i + 1);
            if (candidate < 0) {
                candidate = correctAnswer + i + 5;
            }
            answers[i] = candidate;
        }
    }
    return answers;
}

注:options是问题选项,它的方法是不言自明的,你可以得到它。不要关心QuestionMultiplicationQuestion的构造函数,它们是不相关的。

我不知道我做错了什么,一切对我来说都是有意义的。我做错了什么?

这里的问题是您使用10 ^ options.get…这和权力不一样,你可以反过来用数学。战俘(10,options.get…)

你的问题是^运算符在这种情况下不作为指数模:)

编辑代码
int minValue = (int)(Math.pow(10, (options.getDigitCount () - 1));
int maxValue = (int)(Math.pow(10, options.getDigitCount ())-1;

我完全理解你为什么弄错了,因为在许多数学课上,^符号表示幂

^是Java中的异或运算符。鉴于此,您的max和min值表达式没有意义。

Random r = new Random ();重新初始化生成器。

这样做一次,而不是每次你需要一个数字。否则将破坏生成器的统计属性。

然后将minValuemaxValue的值分开,使它们具有不同的值,目前它们是相等的,并且可能由于误用异或运算符^而没有意义。

操作符^不是取幂,而是取位或。

有字段:

private Random rand = new Random();
private int generateNumberWithDigitCount () {
    int pow10max = 1;
    for (int digits = options.getDigitCount(); digits > 0; --digits) {
        pow10max *= 10;
    }
    int pow10min = pow10max / 10;
    return pow10min - rand.nextInt(pow10max - pow10min);
}

最新更新