@Risin0

Генерация случайного математического выражения на основе результата?

Всем привет.

Такой вопрос появился: Как можно генерировать случайные математические с настраиваемой сложностью на основе результата?

Грубо говоря, есть число 125, скармливаем абстрактной функции:
/*List<AbstractToken>*/ String generateExpression(int result,int step){
 // code
}


Для примера:
generateExpression(125, 1) = 124 + 1
generateExpression(125, 1) = 25 * 5
generateExpression(125, 1) = 1250 / 10
generateExpression(125, 10) = 10 * 5 + 5 * 2 + 10 + 1 + 1 + 1 + 2 + 1 - 1

Приоритеты умножения\деления учитывать не нужно, считаться будет грубо - слева на право.

Сейчас использую топорный вариант: [случайная часть] [действие] [высчитанное значение] = [результат], но такой вариант не подходит ибо очень однотипно выходит.

Может у вас есть другие идеи?
  • Вопрос задан
  • 1557 просмотров
Решения вопроса 2
@nirvimel
Ваш алгоритм нужно совсем немного доработать: К каждому из чисел в полученном выражении рекурсивно применить ту же функцию генерации выражения, и, полученные последовательности действий, склеить как склеивают строки (удобно для этого использовать связанные списки).
Настройка сложности может заключаться в задании фиксированной глубины рекурсии или в задании коэффициента распределения случайной величины, которая определяет, следует ли на конкретном шаге уходить дальше в глубь рекурсии, или вернуть текущий результат наверх.
И расстановку скобок совсем несложно прикрутить.
Ответ написан
Комментировать
@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты
Можете посмотреть такой пример функции.
//функция возвращает список делителей числа
        public static List<int> getDenaminators(int num)
        {
            List<int> result = new List<int>();
            for (int i = 2; i < num - 1; i++)
            {
                if (num % i == 0)
                    result.Add(i);
            }
            return result;
        }
        public static string Func(int num, int count)
        {
            List<int> deliteli = getDenaminators(num);
            Random rnd = new Random();
            int key;
            string numString = "", operString = "", resultString = "";
            int nextVal = 0;
            
            if (count == 0)
                return num.ToString();
            if (deliteli.Count > 0)
                key = rnd.Next(1, 5);
            else
                key = rnd.Next(1, 4);
            
            switch (key)
            {
                case 1:
                    {
                        nextVal = rnd.Next(1, num);
                        numString = (num - nextVal).ToString();
                        operString = "+";
                    } break;
                case 2:
                    {
                        nextVal = rnd.Next(1, num);
                        numString = (num + nextVal).ToString();
                        operString = "-";
                    } break;
                case 3:
                    {
                        nextVal = rnd.Next(1, 11);
                        numString = (num * nextVal).ToString();
                        operString = "/";
                    } break;
                case 4:
                    {
                        nextVal = deliteli[rnd.Next(0, deliteli.Count)];
                        numString = (num / nextVal).ToString();
                        operString = "*";
                    } break;
            }
            if (count == 1)
                resultString = String.Format("{0} {1} {2}", numString, operString, Func(nextVal, count - 1));
            else
                resultString = String.Format("{0} {1} ({2})", numString, operString, Func(nextVal, count - 1));
            return resultString;
        }

        static void Main(string[] args)
        {
            Console.WriteLine(Func(1024, 6));
        }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@evgeniy_lm
Все очень просто, после получения каждого значения инициализируйте генератор случайных чисел
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы