在 Xcode 8.3 上构建 C++ 正态分布随机数生成器

Build a C++ normal distributed random number generator on Xcode 8.3

我正在尝试构建一个函数,该函数 returns 从 N(0,1) 分布中获取的正随机数。

我在 Internet 上四处寻找,尝试使用两种不同的方法。

这是第一个,我尝试从系统时钟设置随机种子。我在 Cplusplus.com 的这个页面上找到了它:std::normal_distribution::(constructor)

unsigned long normal01_rand() {

        unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();

        std::default_random_engine generator (seed); 

        std::normal_distribution<unsigned long> distribution (0.0, 1.0); 

        long random_value = distribution(generator);
        if (random_value < 0) {
            random_value = random_value * (-1);
        }
        return random_value;
}

这是第二个。我不太了解它的详细工作原理,但我发现它是对 similar question 的回答,我想试一试:

unsigned long normal01_rand() {

        std::random_device rd;

        std::mt19937 e2(rd());

        std::normal_distribution<unsigned long> distribution (0.0, 1.0);

        long random_value = distribution(e2);
        if (random_value < 0) {
            random_value = random_value * (-1);
        }
        return random_value;
}

不幸的是,其中 none 对我有用。如果我使用第一个,当我第一次尝试在我的代码中生成一个随机数时,我的代码会陷入无限循环。第二个反而抛出这个异常:EXC_ARITHMETIC (code=EXC_I386_DIV, subcode=0x0)

我不明白这是怎么回事,为什么。

希望说得够清楚,先谢谢大家了

定义为

template< class RealType = double > class normal_distribution

其中 RealType 只能使用 float、double 或 long double,否则它是未定义的。

代码应该是

std::normal_distribution<double> distribution (0.0, 1.0);

double random_value = distribution(e2);
return fabs(random_value);