diff --git a/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h index 8631c7c54f2..86df4976d81 100644 --- a/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h @@ -187,7 +187,6 @@ public: int n = number_of_vertices(); std::vector points (first, last); - std::random_shuffle (points.begin(), points.end()); spatial_sort (points.begin(), points.end(), geom_traits()); Face_handle f; for (typename std::vector::const_iterator p = points.begin(), end = points.end(); diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h index c1ec747d702..5ea0243fafb 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h @@ -248,7 +248,6 @@ public: int n = number_of_vertices(); std::vector points (first, last); - std::random_shuffle (points.begin(), points.end()); CGAL::spatial_sort (points.begin(), points.end(), geom_traits()); Face_handle hint; diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h index 271c190909b..4719b222f84 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h @@ -204,7 +204,6 @@ public: std::vector points (first, last); - std::random_shuffle (points.begin(), points.end()); spatial_sort (points.begin(), points.end(), geom_traits()); Face_handle hint; diff --git a/Triangulation_2/include/CGAL/Delaunay_triangulation_2.h b/Triangulation_2/include/CGAL/Delaunay_triangulation_2.h index 943107dead3..f422dc73615 100644 --- a/Triangulation_2/include/CGAL/Delaunay_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Delaunay_triangulation_2.h @@ -163,7 +163,6 @@ public: int n = this->number_of_vertices(); std::vector points (first, last); - std::random_shuffle (points.begin(), points.end()); spatial_sort (points.begin(), points.end(), geom_traits()); Face_handle f; for (typename std::vector::const_iterator p = points.begin(), end = points.end(); diff --git a/Triangulation_2/include/CGAL/Regular_triangulation_2.h b/Triangulation_2/include/CGAL/Regular_triangulation_2.h index 0d577dbb8e7..8276ba8f61c 100644 --- a/Triangulation_2/include/CGAL/Regular_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Regular_triangulation_2.h @@ -332,7 +332,6 @@ public: int n = number_of_vertices(); std::vector points (first, last); - std::random_shuffle (points.begin(), points.end()); spatial_sort (points.begin(), points.end(), geom_traits()); Face_handle hint; diff --git a/Triangulation_2/include/CGAL/Triangulation_2.h b/Triangulation_2/include/CGAL/Triangulation_2.h index 60775e615ed..98a70b75f9d 100644 --- a/Triangulation_2/include/CGAL/Triangulation_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_2.h @@ -38,10 +38,12 @@ #include #include #include -#include - #include +#include +#include +#include + CGAL_BEGIN_NAMESPACE template < class Gt, class Tds > class Triangulation_2; template < class Gt, class Tds > std::istream& operator>> @@ -179,7 +181,6 @@ protected: Gt _gt; Tds _tds; Vertex_handle _infinite_vertex; - mutable Random rng; public: // CONSTRUCTORS @@ -1813,6 +1814,11 @@ march_locate_2D(Face_handle c, { CGAL_triangulation_assertion(! is_infinite(c)); + boost::rand48 rng; + + boost::uniform_smallint<> two(0, 1); + boost::variate_generator > coin(rng, two); + Face_handle prev = Face_handle(); bool first = true; while (1) { @@ -1832,7 +1838,7 @@ march_locate_2D(Face_handle c, // We do loop unrolling in order to find out if this is faster. // In the very beginning we do not have a prev, but for the first step // we do not need randomness - int left_first = rng.template get_bits<1>(); + int left_first = coin()%1; const Point & p0 = c->vertex( 0 )->point(); const Point & p1 = c->vertex( 1 )->point(); @@ -1985,7 +1991,10 @@ march_locate_2D(Face_handle c, int& li) const { CGAL_triangulation_assertion(! is_infinite(c)); - + + boost::uniform_smallint<> four(0, 3); + boost::variate_generator > die4(rng, four); + Face_handle prev = Face_handle(); while (1) { if ( is_infinite(c) ) { @@ -1999,7 +2008,7 @@ march_locate_2D(Face_handle c, // we test its edges in a random order until we find a // neighbor to go further - int i = rng.template get_bits<2>(); + int i = die4(); int ccwi = ccw(i); int cwi = cw(i); const Point & p0 = c->vertex( i )->point(); diff --git a/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h b/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h index d9319eca7d8..5d213aa05c2 100644 --- a/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h @@ -22,10 +22,13 @@ #define CGAL_TRIANGULATION_HIERARCHY_2_H #include -#include #include #include +#include +#include +#include + CGAL_BEGIN_NAMESPACE // parameterization of the hierarchy @@ -60,7 +63,7 @@ class Triangulation_hierarchy_2 private: // here is the stack of triangulations which form the hierarchy Tr_Base* hierarchy[Triangulation_hierarchy_2__maxlevel]; - Random random; // random generator + boost::rand48 random; public: Triangulation_hierarchy_2(const Geom_traits& traits = Geom_traits()); @@ -69,7 +72,7 @@ public: template Triangulation_hierarchy_2(InputIterator first, InputIterator beyond, const Geom_traits& traits = Geom_traits()) - : Tr_Base(traits), random((long)0) + : Tr_Base(traits) { hierarchy[0] = this; for(int i=1;inumber_of_vertices(); std::vector points (first, last); - std::random_shuffle (points.begin(), points.end()); CGAL::spatial_sort (points.begin(), points.end(), geom_traits()); // hints[i] is the face of the previously inserted point in level i. @@ -205,7 +207,7 @@ private: template Triangulation_hierarchy_2:: Triangulation_hierarchy_2(const Geom_traits& traits) - : Tr_Base(traits), random((long)0) + : Tr_Base(traits) { hierarchy[0] = this; for(int i=1;i Triangulation_hierarchy_2:: Triangulation_hierarchy_2(const Triangulation_hierarchy_2 &tr) - : Tr_Base(), random((long)0) + : Tr_Base() { // create an empty triangulation to be able to delete it ! hierarchy[0] = this; @@ -564,16 +566,14 @@ int Triangulation_hierarchy_2:: random_level() { - int l = 0; - while (1) { - if ( random(Triangulation_hierarchy_2__ratio) ) break; - ++l; - } - if (l >= Triangulation_hierarchy_2__maxlevel) - l = Triangulation_hierarchy_2__maxlevel -1; - return l; + boost::geometric_distribution<> proba(1.0/Triangulation_hierarchy_2__ratio); + boost::variate_generator > die(random, proba); + + return (std::min)(die(), Triangulation_hierarchy_2__maxlevel)-1; + } CGAL_END_NAMESPACE #endif // CGAL_TRIANGULATION_HIERARCHY_2_H +