Попытка заменить старый случайный API на C ++ 11 - PullRequest
1 голос
/ 03 апреля 2020

У меня есть фрагмент существующего кода, который использует случайные числа:

double Foo(bool b)
{
    double d = 200.0;
    if (b)
    {
        d /= RAND_MAX + 1;
        srand((unsigned)time(NULL));
    }
    return (d / rand());
}

Я хотел бы заменить его на эквивалент C ++ 11, но никогда раньше не использовал этот API. После прохождения этого примера и этого документа я получил следующий код:

#include <chrono>
#include <random>
class MVCE
{
    private:

    std::default_random_engine m_generator;
    std::uniform_int_distribution<int> m_distribution{};

    public:

    MVCE()
    {
        unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
        m_generator.seed(seed);
    }

    double Foo(bool b)
    {
        double d = 200.0;
        if(b)
        {
            d /= m_generator.max() - m_generator.min() + 1;

            unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
            m_generator.seed(seed);
        }
        return (d / (m_generator() - m_generator.min()));
    }
};

Я использую Visual Studio 2019. При попытке MVCE класс на Ideone, он работает, но Visual studio жалуется на m_generator.max()' and m_generator.min () 'со следующей ошибкой:

E0133 expected a member name

При наведении курсора на max() показывается макрос max (#define max(a, b) (((a) > (b)) ? (a) : (b))), при наведении на min() показывает макрос min (#define min(a, b) (((a) < (b)) ? (a) : (b))).

Поскольку я впервые использую новый API, может ли кто-нибудь проверить, правильно ли я его использовал? Может кто-нибудь помочь мне устранить упомянутую ошибку?

1 Ответ

0 голосов
/ 03 апреля 2020

Это слишком сложно. Вы хотите std::uniform_real_distribution<>(0, 200.0);

...