Having some problems porting some code between C++0x and TR1. The C++0x version
works as expected, but the TR1 uniform_real distribution seems to be returning
elements outside the given range.
And example:
#include <string>
#include <iostream>
#ifdef __GXX_EXPERIMENTAL_CXX0X__
# include <functional>
# include <random>
#else
# include <tr1/functional>
# include <tr1/random>
#endif
#ifdef __GXX_EXPERIMENTAL_CXX0X__
typedef std::uniform_real_distribution<double> distribution_type;
typedef std::mt19937 engine_type;
#else
typedef std::tr1::uniform_real<double> distribution_type;
typedef std::tr1::mt19937 engine_type;
#endif
double
generate()
{
const distribution_type distribution(0, 1);
static engine_type engine;
#ifdef __GXX_EXPERIMENTAL_CXX0X__
static auto generator = std::bind(distribution, engine);
#else
typedef std::tr1::_Bind<distribution_type(engine_type)> __result_type;
static __result_type generator = std::tr1::bind(distribution, engine);
#endif
double random = generator();
if (random < distribution.min() || random > distribution.max())
{
std::string __s("throw_allocator::throw_conditionally");
__s += "\n";
__s += "random number generated is: ";
char buf[40];
__builtin_sprintf(buf, "%f", random);
__s += buf;
std::__throw_out_of_range(__s.c_str());
}
else
std::cout << random << std::endl;
return random;
}
int main()
{
for (int i(0); i < 50; ++i)
std::cout << generate() << std::endl;
return 0;
}
Gives me this for C++03:
%./a.out
terminate called after throwing an instance of 'std::out_of_range'
what(): throw_allocator::throw_conditionally
random number generated is: 3499211612.000000
Abort
Gives me this for C++0x (-std=gnu++0x)
...
0.0512164
0.0512164
0.0364413
0.0364413
0.408731
0.408731
0.457989
0.457989
0.487569
0.487569
0.793975
0.793975
0.920875
0.920875
0.807531
0.807531
...
--
Summary: random unform real distro: tr1 vs c++0x
Product: gcc
Version: 4.4.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: bkoz at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40263