【发布时间】: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 example和this 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) > (b)) ? (a) : (b))),而悬停在min() 上时会显示min 宏(#define min(a, b) (((a) < (b)) ? (a) : (b)))。
由于我是第一次使用新的 API,有人可以验证我是否正确使用了它吗? 有人可以帮我删除提到的错误吗?
【问题讨论】:
-
您是否使用 Visual Studio 并包含
<windows.h>?定义宏max和min是臭名昭著的,这会破坏任何体面的源文件。您可以通过定义宏NOMINMAX来避免这种情况 -
您确定旧代码不是
static double d = 200.0;吗?b似乎是一次性初始化标志,但它只会在一次调用时更改d。 -
@MSalters:它是一个类变量,但我试图让代码示例尽可能简单。