使用 C++11 随机库生成随机数

正如标题所示,我正试图找出一种使用新的 C++11 <随机>库生成随机数的方法。我用这段代码进行了尝试:

std::default_random_engine generator;
std::uniform_real_distribution<double> uniform_distance(1, 10.001);

代码的问题是,每次编译和运行时,生成的数字总是一样的。因此,我的问题是,随机库中还有哪些函数可以在实现真正随机的同时达到这一目的?

对于我的特定用例,我试图得到一个范围在 `[1, 10]`` 内的值。

解决办法

来自微软的 Stephan T. Lavavej (stl) 在 Going Native 大会上发表了关于如何使用新的 C++11 随机函数以及为什么不使用 rand()的演讲。其中,他的一张幻灯片基本上解决了你的问题。我将该幻灯片中的代码复制如下。

您可以在此处查看他的完整演讲:http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful


#include 
#include 

int main() {
    std::random_device rd;
    std::mt19937 mt(rd());
    std::uniform_real_distribution dist(1.0, 10.0);

    for (int i=0; i
评论(9)

以下是我刚写的一些内容::

#include 
#include 
#include 

using namespace std;

//==============================================================
// RANDOM BACKOFF TIME
//==============================================================
class backoff_time_t {
  public:
    random_device                      rd;
    mt19937                            mt;
    uniform_real_distribution  dist;

    backoff_time_t() : rd{}, mt{rd()}, dist{0.5, 1.5} {}

    double rand() {
      return dist(mt);
    }
};

thread_local backoff_time_t backoff_time;

int main(int argc, char** argv) {
   double x1 = backoff_time.rand();
   double x2 = backoff_time.rand();
   double x3 = backoff_time.rand();
   double x4 = backoff_time.rand();
   return 0;
}

~

评论(0)

有两种常见情况。第一种情况是您需要随机数,但对随机数的质量或执行速度并不太在意。在这种情况下,请使用以下宏

#define uniform() (rand()/(RAND_MAX + 1.0))

可以得到范围在 0 到 1 - epsilon 之间的 p(除非 RAND_MAX 大于 double 的精度,不过这个问题到时再考虑)。

int x = (int) (uniform() * N);

现在给出一个 0 到 N -1 的随机整数。

如果需要其他分布,则必须变换 p,或者有时多次调用 uniform() 更简单。

如果你想要可重复的行为,可以使用常数作为种子,否则可以调用 time() 作为种子。

如果你担心质量或运行时的性能,可以重写 uniform()。否则就不要碰代码。始终将 uniform() 设为 0 至 1 减ε。现在,你可以使用 C++ 随机数库来创建更好的 uniform(),但这只是中级选项。如果你对 RNG 的特性感到困扰,那么也值得投入一点时间来了解底层方法是如何工作的,然后提供一个。这样,您就可以完全控制代码,并保证使用相同的种子,序列将始终完全相同,而不受平台或所链接的 C++ 版本的影响。

评论(2)