summaryrefslogtreecommitdiff
path: root/cpp/include/IceUtil/Random.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/include/IceUtil/Random.h')
-rw-r--r--cpp/include/IceUtil/Random.h34
1 files changed, 34 insertions, 0 deletions
diff --git a/cpp/include/IceUtil/Random.h b/cpp/include/IceUtil/Random.h
index f576205d201..69d4c0b4dea 100644
--- a/cpp/include/IceUtil/Random.h
+++ b/cpp/include/IceUtil/Random.h
@@ -13,12 +13,46 @@
#include <IceUtil/Config.h>
#include <IceUtil/Exception.h>
+#ifdef ICE_CPP11_COMPILER
+# include <algorithm>
+# include <random>
+#endif
+
namespace IceUtilInternal
{
ICE_API void generateRandom(char*, size_t);
ICE_API unsigned int random(int = 0);
+#ifdef ICE_CPP11_COMPILER
+
+template<class T>
+void shuffle(T first, T last)
+{
+ std::random_device rd;
+ std::mt19937 rng(rd());
+ std::shuffle(first, last, rng);
+}
+
+#else
+
+struct RandomNumberGenerator : public std::unary_function<std::ptrdiff_t, std::ptrdiff_t>
+{
+ std::ptrdiff_t operator()(std::ptrdiff_t d)
+ {
+ return IceUtilInternal::random(static_cast<int>(d));
+ }
+};
+
+template<class T>
+void shuffle(T first, T last)
+{
+ RandomNumberGenerator rng;
+ random_shuffle(first, last, rng);
+}
+
+#endif
+
}
#endif