在 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);
我正在尝试构建一个函数,该函数 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);