我发现GCC 6.1.0中的C ++ 11随机数生成器导致代码卡在Mac OS X 10.11.5中,一个简单的代码片段如下:
#include <iostream>
#include <armadillo>
using namespace std;
using namespace arma;
int main(int argc, char const* argv[])
{
cout << "check 1" << endl;
cout << arma_rng::randn<double>() << endl;
cout << "check 2" << endl;
return 0;
}
我使用lldb
调试了此代码,并将可疑部分锁定在random.tcc
的{{1}}文件中:
libstdc++
其中/**
* Polar method due to Marsaglia.
*
* Devroye, L. Non-Uniform Random Variates Generation. Springer-Verlag,
* New York, 1986, Ch. V, Sect. 4.4.
*/
template<typename _RealType>
template<typename _UniformRandomNumberGenerator>
typename normal_distribution<_RealType>::result_type
normal_distribution<_RealType>::
operator()(_UniformRandomNumberGenerator& __urng,
const param_type& __param)
{
result_type __ret;
__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
__aurng(__urng);
if (_M_saved_available)
{
_M_saved_available = false;
__ret = _M_saved;
}
else
{
result_type __x, __y, __r2;
do
{
__x = result_type(2.0) * __aurng() - 1.0;
__y = result_type(2.0) * __aurng() - 1.0;
__r2 = __x * __x + __y * __y;
}
while (__r2 > 1.0 || __r2 == 0.0);
const result_type __mult = std::sqrt(-2 * std::log(__r2) / __r2);
_M_saved = __x * __mult;
_M_saved_available = true;
__ret = __y * __mult;
}
__ret = __ret * __param.stddev() + __param.mean();
return __ret;
}
始终返回0,因此永远不会遇到__aurng()
。
更新:
我发现它可能是Armadillo库中的一个错误,因为我尝试了以下代码,这是正常的:
__r2 > 1.0 || __r2 == 0.0