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:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user