summaryrefslogtreecommitdiff
path: root/boost/compute/algorithm/random_shuffle.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/compute/algorithm/random_shuffle.hpp')
-rw-r--r--boost/compute/algorithm/random_shuffle.hpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/boost/compute/algorithm/random_shuffle.hpp b/boost/compute/algorithm/random_shuffle.hpp
index 8e020830a5..7405c17374 100644
--- a/boost/compute/algorithm/random_shuffle.hpp
+++ b/boost/compute/algorithm/random_shuffle.hpp
@@ -14,6 +14,11 @@
#include <vector>
#include <algorithm>
+#ifdef BOOST_COMPUTE_USE_CPP11
+#include <random>
+#endif
+
+#include <boost/static_assert.hpp>
#include <boost/range/algorithm_ext/iota.hpp>
#include <boost/compute/system.hpp>
@@ -22,6 +27,7 @@
#include <boost/compute/container/vector.hpp>
#include <boost/compute/algorithm/scatter.hpp>
#include <boost/compute/detail/iterator_range_size.hpp>
+#include <boost/compute/type_traits/is_device_iterator.hpp>
namespace boost {
namespace compute {
@@ -36,6 +42,7 @@ inline void random_shuffle(Iterator first,
Iterator last,
command_queue &queue = system::default_queue())
{
+ BOOST_STATIC_ASSERT(is_device_iterator<Iterator>::value);
typedef typename std::iterator_traits<Iterator>::value_type value_type;
size_t count = detail::iterator_range_size(first, last);
@@ -46,7 +53,13 @@ inline void random_shuffle(Iterator first,
// generate shuffled indices on the host
std::vector<cl_uint> random_indices(count);
boost::iota(random_indices, 0);
+#ifdef BOOST_COMPUTE_USE_CPP11
+ std::random_device nondeterministic_randomness;
+ std::default_random_engine random_engine(nondeterministic_randomness());
+ std::shuffle(random_indices.begin(), random_indices.end(), random_engine);
+#else
std::random_shuffle(random_indices.begin(), random_indices.end());
+#endif
// copy random indices to the device
const context &context = queue.get_context();