Для моей программы мне нужно генерировать действительные выражения infix с настраиваемой сложностью. Проблема в том, что я не могу найти способ предотвратить деление на ноль, ответы с плавающей запятой и отрицательные ответы.Произвольно генерировать действительное арифметическое выражение infix
Чтобы предотвратить отрицательные ответы, я принимаю грязный подход. То есть, генерировать выражение, оценить его, если он оказывается отрицательным, генерировать again.Here некоторые вещи, которые вы должны знать:
- inToPost() представляет собой метод, который преобразует сгенерированное выражение инфиксную в постфикса для оценка.
- complexLevel < = DIVIDE подразумевает, что мы не должны помещать скобки в выражение.
- complexLevel == ARITHMETIC_PARENTHESIS подразумевает, что скобки включены.
Как я могу убедиться, что а) нет делений на ноль б) никаких разделений не приводят с плавающей точкой (разобрался грязный способ сделать это) с) конечный результат не отрицательный Вот код
public void generateRandom(int operandLimit, int operatorCount, int complexityLevel) {
Random rand = new Random();
infix.clear();
int i = 0;
infix.add(rand.nextInt(operandLimit) + 1);
while(i < operatorCount) {
int operator;
if(complexityLevel <= DIVIDE)
operator = rand.nextInt(complexityLevel - 1)*1000 + 1000;
else
operator = rand.nextInt(complexityLevel - 3)*1000 + 1000;
int operand = rand.nextInt(operandLimit) + 1;
if(operator == Operator.DIVIDE) {
int lastNum = infix.get(infix.size() - 1);
if(lastNum < operand) {
int temp = operand;
operand = lastNum;
lastNum = temp;
}
lastNum -= lastNum % operand;
infix.set(infix.size() - 1, lastNum);
}
infix.add(operator);
infix.add(operand);
++i;
}
if(complexityLevel == ARITMETIC_PARENTHESIS) {
int braceOpen = rand.nextInt(operatorCount) * 2;
infix.add(braceOpen, Operator.BR_OPEN);
infix.add(braceOpen + 4, Operator.BR_CLOSE);
}
inToPost();
if(evaluate() < 0)
generateRandom(operandLimit, operatorCount, complexityLevel);
}
Я мог бы изменить оператор внутри от - до + для этого. Спасибо :) – wirate
для C) Я действительно не чувствую, что я делаю это правильно. Генерирование выражений снова и снова до тех пор, пока не появится ответ + – wirate
Когда я столкнулся с такими ситуациями, которые имеют сложные ограничения, я обычно обнаружил, что генерация множества параметров и фильтрация тех, которые соответствуют ограничениям, приводят к более чистому коду, чем попытка для генерации в рамках ограничений. –