@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

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

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

Может у вас есть другие идеи?
  • Вопрос задан
  • 1393 просмотра
Решения вопроса 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
Все очень просто, после получения каждого значения инициализируйте генератор случайных чисел
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
First Line Software Будва
от 3 700 до 5 600 $
Sportmaster Lab Волгоград
от 200 000 до 350 000 ₽
Сбер Иннополис
от 70 000 ₽