std :: mt19937和std :: uniform_real_distribution每次返回边界值

时间:2016-08-22 03:51:39

标签: c++ c++11 random

好的,所以我有一些RNG代码(当完成所有内容时)归结为:

#include <limits>
#include <random>
#include <chrono>
#include <iostream>

double randomValue() {
    // Seed a Mersenne Twister (good RNG) with the current system time
    std::mt19937 generator(std::chrono::system_clock::now().time_since_epoch().count());

    std::uniform_real_distribution<double> dist(
        std::numeric_limits<double>::lowest(),
        std::numeric_limits<double>::max()
    );

    // Problem lives here
    for (unsigned int i = 0; i < 30; i++)
        std::cout << dist(generator) << "\n";
}

此输出是30行inf。为什么呢?

使用g++编译-std=c++11 Debian 4.9.2-10,没有其他标记。并且,在其他任何人评论它之前,我使用内置的基于Mersenne Twister的RNG,因为我的应用程序需要高质量的随机数,并且用系统时间播种它(所以不,它不仅仅是相同的种子并且一遍又一遍。)

1 个答案:

答案 0 :(得分:10)

根据C++14 section 26.5.8.2.2 paragraph 2

Requires: a ≤ b and b − a ≤ numeric_limits<RealType>::max().

在您的情况下,b-a大于允许的范围。