Ответы пользователя по тегу Алгоритмы
  • Возможно ли рассчитать коэффициенты победы лишь на основании пройденного времени и прежних коэффициентов?

    @lorc
    Гуглите про формулу Байеса. Она именно для этого и нужна - корректировка вероятностей при наступлении какого-то события. Встанет вопрос в том, что считать событиями и какие им приписывать вероятности. Тут нужно будет поэкспериментировать.

    Очень хорошо, если у вас будет набор данных со всех прошедших игр, это поможет правильно настроить модель и проанализировать ее эффективность.
    Ответ написан
    Комментировать
  • По какой формуле считается приз на рулетках?

    @lorc
    Ну на самом деле все логично. Мы делим ставку на вероятность выигрыша. И округляем конечно же вниз:

    1 / 0.01 = 100
    1 / 0.95 = 1.0526 ~= 1.05

    Если предположить что шансы у них честные, то доход казино обеспечивается как раз этим округлением вниз. Во втором случае матожидание выигрыша получается 1.05 * 0.95 = 0.9975 рубля на каждый поставленный рубль.

    Классическая рулетка работает точно так же. Только там добавляется сектор зеро, на котором вы всегда проигрываете. Он и обеспечивает доход казино.
    Ответ написан
    Комментировать
  • Как остановить вращение в нужном месте?

    @lorc
    Ну я бы в момент нажатия на "стоп" определил угол где колесо должно остановиться. Например, с помощью генератора случайных чисел.

    Допустим, в момент нажатия "стоп" угол колеса alpha, а мы хотим чтобы оно остановилось в угле beta, сделав около пяти оборотов. Тогда, если alpha > beta, то нам нужно провернуть колесо на theta = 360 * 5 + beta - alpha градусов.
    Если alpha < beta, то понадобиться например theta = 360 * 6 - beta + alpha градусов.

    Итого, мы знаем скорость вращения speed, знаем количество градусов которое нужно пройти - theta. Знаем что в конце скорость должна быть 0. Надо посчитать замедление а.

    Пришло время математики. За время t колесо провернется на speed * t - a * t * t /2 градусов. Нам надо чтобы оно провернулось на theta.

    Значит, мы имеем уравнение speed * t - a * t * t /2 = theta. Еще мы помним что скорость в конце должна быть равна 0. Значит speed - a * t = 0.

    Подставляем, сокращем. Получаем a = speed * speed / ( 2 * theta). Теперь вы знаете замедление, на которое нужно уменьшать скорость каждый цикл.

    Только, учтите, что у вас время дискретно поэтому, не налажайте с единицами измерения для t, speed и а.
    Ответ написан
    Комментировать
  • Как найти в списке чисел диапазон статистически наибольших чисел?

    @lorc
    Если чисел не очень много, то можно взять n-ый персентиль. Грубо говоря - отсортировать все показатели здоровья по убыванию и взять 5-10% верхних.
    Ответ написан
    Комментировать
  • Не работает sort, но явную ошибку в коде не находит. Как исправить?

    @lorc
    Вы бы хотя бы привели сообщение об ошибке.

    Проблема в том, что ваш компаратор - это метод класса. Было бы странно использовать его без объекта. На что вам компилятор и намекает.

    Вот исправленный вариант:

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <list>
    #include <string>
    #include <fstream>
    #include <cmath>
    #include <functional>
    
    using namespace std;
    
    class Finder
    {
    public:
        list<vector<double>> lines; //список, в котором информация
        vector<double> input = {0, 0}; //массив, который вводит пользователь
        string path; //путь к файлу
    
        Finder(string path, string numbs) //конструктор открывает файл и создает входной массив
        {
            this->path = path;
    
            int l = numbs.size();
            vector<double> input;
    
            for (int i = 0; i < l; i++)
            {
                string buffer = "";
    
                if (numbs[i] != ' ')
                {
                    buffer += numbs[i];
                }
                else
                {
                    input.push_back(stod(buffer));
                    buffer = "";
                }
            }
    
            this->input = input;
            cout << "Initialization was successful" << endl;
        }
    
        void GetData() //да, загружать из файла в память обязательно
        {
            ifstream fin(path);
            string line;
    
            while (getline(fin, line))
            {
                int l = line.size();
                string buffer = "";
                vector<double> numbers;
    
                for (int i = 0; i < l; i++)
                {
                    if (line[i] != ' ')
                    {
                        buffer += line[i];
                    }
                    else
                    {
                        numbers.push_back(stod(buffer));
                        buffer = "";
                    }
                }
    
                this->lines.push_back(numbers);
            }
    
            fin.close();
            cout << lines.size();
        }
    
        double GetDistance(vector<double> a) //расчет расстояним между точками
        {
            int l = this->input.size();
            double sum = 0;
    
            for (int i = 0; i < l; i++)
            {
                double el_i = this->input.at(i);
                double el_a = a.at(i);
    
                sum += pow((el_i - el_a), 2);
            }
    
            return sqrt(sum);
        }
    
        bool compareTo(vector<double> a, vector<double> b) //компаратор
        {
            return GetDistance(a) < GetDistance(b);
        }
    
        void ShowHeigbor() //для пользователя
        {
        	using namespace std::placeholders;  // for _1, _2, _3...
    
            this->lines.sort(std::bind(&Finder::compareTo, this, _1, _2));
        }
    };
    
    int main()
    {
        string inp;
        cout << "Input vector: ";
        cin >> inp;
    
        Finder f{"data.txt", inp};
    
        f.GetData();
        //f.ShowHeigbor();
    }
    Ответ написан
    4 комментария
  • Есть ли готовая библиотека или алгоритм для превращения if выражения в CNF формулу?

    @lorc
    Ну собственно алгоритм прямо в Википедии описан.

    Если термов не очень много - можно попробовать применить Метод Куайна—Мак-Класки. Таким образом вы убьете двух зайцев сразу - получите не просто КНФ, а минимальную КНФ.
    Ответ написан
    Комментировать