是否普遍接受实现自己的随机函数? (C ++)

时间:2016-10-01 16:17:03

标签: c++ function c++11 random stl

假设您正在处理需要随机数的(严重)项目。

如下的行:

app.run(threaded=True)

(显然)不会出现在那里。 C ++ 11标题int num = rand() % 6 + 5; //random number between 5 - 10 毫无疑问地击败了这个旧的C风格。

<random>

但是当在一个小组工作时,我可以看到这个方法存在两个问题:

  • 语法很难阅读。

  • 对于这么常见的简单任务来说太复杂了。

所以有一个函数(基于这个方法)看起来真的很好:

std::random_device rd;
std::mt19937 engine(rd());
std::uniform_int_distribution<int> generate(5, 10);
int num = generate(engine);

就我而言,没有这样的STL功能。所以我要求你的经验:你可以自己实现这个功能吗?也许导出到一个单独的标题,然后重载它为双打和浮动等。 我问这个问题,因为在这个现代C ++时代,使用STL函数的标准是,这种情况下语法实际上迫使你自己实现。谢谢你的帮助和帮助关于这个主题的经验。

编辑:最后我要问的是,在处理随机数的任何项目中,这样的实现总是会发生(迟早)。

2 个答案:

答案 0 :(得分:4)

C ++的一个关键目标是使编写特定于域的抽象变得容易;如果您正在编写经常使用特定形式的随机数生成的代码,请务必将其封装在适当的函数中。

答案 1 :(得分:1)

在TS 2中有randint,但它可能无法进入C ++ 17。

所以现在如果你不能/不会使用<experimental/...>,那么实施你自己是有意义的。考虑使用thread_local引擎。

int getRandom(int range_begin, int range_end)
{
    thread_local std::mt19937 engine(std::random_device{}());
    std::uniform_int_distribution<int> generate(range_begin, range_end);
    return generate(engine);
}

在大多数架构中,它仍然只用32位随机性初始化engine,但这对你来说已经足够了。