aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrasimir Georgiev <krasimir@google.com>2017-11-08 13:28:53 +0000
committerKrasimir Georgiev <krasimir@google.com>2017-11-08 13:28:53 +0000
commite02f32ba0e6d794e6196aca69f14f8130d0bd455 (patch)
treeccf3e31369a3c283a51c3d77cf9f8f2f4fa82e54
parentfc8e981f5daea5ccb75ef1dbe9052bc3ca2c0ec0 (diff)
[clang-tidy] Add a note about modernize-replace-random-shuffle
Summary: This adds a note warning the users that the way the suggested fix seeds the random number generator is poor. Reviewers: hokein Reviewed By: hokein Subscribers: cfe-commits, xazax.hun Differential Revision: https://reviews.llvm.org/D39787 git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@317689 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--docs/clang-tidy/checks/modernize-replace-random-shuffle.rst13
1 files changed, 13 insertions, 0 deletions
diff --git a/docs/clang-tidy/checks/modernize-replace-random-shuffle.rst b/docs/clang-tidy/checks/modernize-replace-random-shuffle.rst
index 353f35a8..50674d42 100644
--- a/docs/clang-tidy/checks/modernize-replace-random-shuffle.rst
+++ b/docs/clang-tidy/checks/modernize-replace-random-shuffle.rst
@@ -26,3 +26,16 @@ Both of these examples will be replaced with:
The second example will also receive a warning that ``randomFunc`` is no longer supported in the same way as before so if the user wants the same functionality, the user will need to change the implementation of the ``randomFunc``.
One thing to be aware of here is that ``std::random_device`` is quite expensive to initialize. So if you are using the code in a performance critical place, you probably want to initialize it elsewhere.
+Another thing is that the seeding quality of the suggested fix is quite poor: ``std::mt19937`` has an internal state of 624 32-bit integers, but is only seeded with a single integer. So if you require
+higher quality randomness, you should consider seeding better, for example:
+
+.. code-block:: c++
+
+ std::shuffle(v.begin(), v.end(), []() {
+ std::mt19937::result_type seeds[std::mt19937::state_size];
+ std::random_device device;
+ std::uniform_int_distribution<typename std::mt19937::result_type> dist;
+ std::generate(std::begin(seeds), std::end(seeds), [&] { return dist(device); });
+ std::seed_seq seq(std::begin(seeds), std::end(seeds));
+ return std::mt19937(seq);
+ }());