【问题标题】:Is it generally accepted to implement your own random functions ? (C++)实现自己的随机函数是否被普遍接受? (C++)
【发布时间】:2016-10-01 16:17:02
【问题描述】:

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

类似的行:

int num = rand() % 6 + 5; //random number between 5 - 10

(显然)不会出现在那里。 C++11 标头<random> 毫无疑问地击败了这个旧的 C-Style。

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

但是当在一个小组中工作时,我发现这个方法有两个问题:

  • 语法怪异且难以阅读。

  • 对于如此简单的任务来说太复杂了。

所以如果有一个看起来像这样的函数(基于此方法)会非常好:

int getRandom(int range_begin, int range_end);

就我而言,没有这样的 STL 功能。所以想请教各位的经验:这个功能自己实现可以吗?也许导出到单独的标题中,然后将其重载为双精度和浮点等。 我问这个问题,因为在现代 C++ 时代,使用 STL 函数是标准的,这是语法实际上迫使您自己实现的情况。感谢您在此主题上的帮助和经验。

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

【问题讨论】:

  • 你不需要任何人的许可来实现一个功能。

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


【解决方案1】:

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

【讨论】:

  • +1,真的,这只是编程中的常识,并非特定于 RNG - 如果您编写的代码始终执行相同的任务代码,请务必将其封装在适当的函数中。
【解决方案2】:

TS 2 中有 randint,但它可能不会进入 C++17。

因此,如果您不能/不会使用&lt;experimental/...&gt;,那么现在实现自己的功能是有意义的。不过考虑使用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,但这对您来说可能已经足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2016-04-02
    相关资源
    最近更新 更多