2
0
mirror of https://github.com/boostorg/graph.git synced 2026-01-19 04:12:11 +00:00

Use std::mt19937 where available

In C++17 mode, libc++'s `std::shuffle` isn't compatible with Boost's random
generators because the `min` and `max` functions aren't `constexpr`, so use
`std::mt19937` instead. This might not be required if boostorg/random#24 is
accepted.
This commit is contained in:
Daniel James
2018-04-13 14:05:00 +01:00
parent e0b46b934e
commit 4c752ee2f1
2 changed files with 27 additions and 12 deletions

View File

@@ -31,6 +31,13 @@
#include <boost/random/mersenne_twister.hpp>
#include <boost/lexical_cast.hpp>
#ifndef BOOST_NO_CXX11_HDR_RANDOM
#include <random>
typedef std::mt19937 random_generator_type;
#else
typedef boost::mt19937 random_generator_type;
#endif
using namespace boost;
#ifndef BOOST_NO_CXX98_RANDOM_SHUFFLE
@@ -39,7 +46,7 @@ struct random_functor {
random_functor(Generator& g) : g(g) { }
std::size_t operator()(std::size_t n) {
boost::uniform_int<std::size_t> distrib(0, n-1);
boost::variate_generator<boost::mt19937&, boost::uniform_int<std::size_t> >
boost::variate_generator<random_generator_type&, boost::uniform_int<std::size_t> >
x(g, distrib);
return x();
}
@@ -58,9 +65,10 @@ void randomly_permute_graph(const Graph1& g1, Graph2& g2)
typedef typename graph_traits<Graph2>::vertex_descriptor vertex2;
typedef typename graph_traits<Graph1>::edge_iterator edge_iterator;
boost::mt19937 gen;
random_generator_type gen;
#ifndef BOOST_NO_CXX98_RANDOM_SHUFFLE
random_functor<boost::mt19937> rand_fun(gen);
random_functor<random_generator_type> rand_fun(gen);
#endif
// Decide new order
@@ -86,9 +94,9 @@ template<typename Graph>
void generate_random_digraph(Graph& g, double edge_probability)
{
typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
boost::mt19937 random_gen;
random_generator_type random_gen;
boost::uniform_real<double> distrib(0.0, 1.0);
boost::variate_generator<boost::mt19937&, boost::uniform_real<double> >
boost::variate_generator<random_generator_type&, boost::uniform_real<double> >
random_dist(random_gen, distrib);
for (vertex_iterator u = vertices(g).first; u != vertices(g).second; ++u) {

View File

@@ -31,6 +31,13 @@
#include <boost/lexical_cast.hpp>
#include <boost/graph/graphviz.hpp>
#ifndef BOOST_NO_CXX11_HDR_RANDOM
#include <random>
typedef std::mt19937 random_generator_type;
#else
typedef boost::mt19937 random_generator_type;
#endif
using namespace boost;
#ifndef BOOST_NO_CXX98_RANDOM_SHUFFLE
@@ -56,10 +63,10 @@ void randomly_permute_graph(Graph1& g1, const Graph2& g2) {
typedef typename graph_traits<Graph2>::vertex_descriptor vertex2;
typedef typename graph_traits<Graph1>::vertex_iterator vertex_iterator;
typedef typename graph_traits<Graph2>::edge_iterator edge_iterator;
boost::mt19937 gen;
random_generator_type gen;
#ifndef BOOST_NO_CXX98_RANDOM_SHUFFLE
random_functor<boost::mt19937> rand_fun(gen);
random_functor<random_generator_type> rand_fun(gen);
#endif
// Decide new order
@@ -100,9 +107,9 @@ void generate_random_digraph(Graph& g, double edge_probability,
BOOST_REQUIRE(0 <= max_vertex_name);
typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
boost::mt19937 random_gen;
random_generator_type random_gen;
boost::uniform_real<double> dist_real(0.0, 1.0);
boost::variate_generator<boost::mt19937&, boost::uniform_real<double> >
boost::variate_generator<random_generator_type&, boost::uniform_real<double> >
random_real_dist(random_gen, dist_real);
for (vertex_iterator u = vertices(g).first; u != vertices(g).second; ++u) {
@@ -119,14 +126,14 @@ void generate_random_digraph(Graph& g, double edge_probability,
{
boost::uniform_int<int> dist_int(0, max_edge_name);
boost::variate_generator<boost::mt19937&, boost::uniform_int<int> >
boost::variate_generator<random_generator_type&, boost::uniform_int<int> >
random_int_dist(random_gen, dist_int);
randomize_property<vertex_name_t>(g, random_int_dist);
}
{
boost::uniform_int<int> dist_int(0, max_vertex_name);
boost::variate_generator<boost::mt19937&, boost::uniform_int<int> >
boost::variate_generator<random_generator_type&, boost::uniform_int<int> >
random_int_dist(random_gen, dist_int);
randomize_property<edge_name_t>(g, random_int_dist);