【问题标题】:Trying to replace old random API with the C++11 one试图用 C++11 替换旧的随机 API
【发布时间】:2020-04-03 08:21:10
【问题描述】:

我有一段使用随机数的现有代码:

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

我想用等效的 C++11 替换它,但以前从未使用过该 API。 经过this examplethis document后,我想出了以下代码:

#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。在 Ideone 上试用 MVCE 类时,它可以工作,但 Visual Studio 抱怨 m_generator.max()' andm_generator.min()' 并出现以下错误:

E0133 expected a member name

当悬停在max() 上时,它会显示max 宏(#define max(a, b) (((a) &gt; (b)) ? (a) : (b))),而悬停在min() 上时会显示min 宏(#define min(a, b) (((a) &lt; (b)) ? (a) : (b)))。

由于我是第一次使用新的 API,有人可以验证我是否正确使用了它吗? 有人可以帮我删除提到的错误吗?

【问题讨论】:

  • 您是否使用 Visual Studio 并包含 &lt;windows.h&gt;?定义宏 maxmin 是臭名昭著的,这会破坏任何体面的源文件。您可以通过定义宏 NOMINMAX 来避免这种情况
  • 您确定旧代码不是static double d = 200.0; 吗? b 似乎是一次性初始化标志,但它只会在一次调用时更改 d
  • @MSalters:它是一个类变量,但我试图让代码示例尽可能简单。

标签: c++ c++11 random


【解决方案1】:

【讨论】:

  • 很抱歉,但就我个人而言,我认为这不是问题的直接答案。
  • @JohnDing:他正在尝试用 C++11 API 替换旧的 rand() API。 std::uniform_real_distribution&lt;&gt; 怎么不是 C++11 API 的一部分?!
  • 我认为主要问题是有人可以帮我消除上述错误吗?,我个人认为您的回答可能是评论。 \ _ \
  • @JohnDing:该解决方案除了回答标题中的问题外,还消除了正文中提到的错误。 bolov 正确投票的评论是评论,因为它没有回答主要问题。
猜你喜欢
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 2021-02-20
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多