How to make sure that std::random_shuffle always produces a different result?

蹲街弑〆低调 提交于 2019-12-17 12:47:11

问题


Is there some function, similar to srand(), that I need to call to make sure that std::random_shuffle() always produces different results? i.e. if I call it several times with the same data, I want the order to be different every time. How can I make sure of that?


回答1:


std::random_shuffle has two forms. One that takes 2 arguments (begin/end iterators), and one that takes 3 (begin/end iterator and a random generator).

The first form uses std::rand(), so you would use std::srand() to seed it's random number generator. You can also use the 3-argument version and provide the RNG yourself.




回答2:


std::random_shuffle has a template overload for specifying the RNG.

template <class RandomAccessIterator, class RandomNumberGenerator>
  void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
                        RandomNumberGenerator& rand );

reference




回答3:


random_shuffle is deprecated since C++14 (removed in C++17) and replaced with shuffle (exists since C++11) http://en.cppreference.com/w/cpp/algorithm/random_shuffle

possible usage:

shuffle(items.begin(), items.end(), std::default_random_engine(std::random_device()()));



回答4:


Generally call srand(time(NULL)) before calling std::random_shuffle() would give you what you need, it give you different result each time you call std::random_shuffle(). It's because std::random_shuffle() internally calls rand() in many populate implementation(e.g VS2008 and gcc).

Of course you can supple a RNG yourself if you want to call the other overloaded std::random_shuffle with a extra parameter.




回答5:


I think you can give a random generator functor to std::random_shuffle, so you can be able to fully control the random number generation. Looking here, this functor takes the place of the RandomNumberGenerator template argument.




回答6:


As a last resort, you can:

  • Call std::random_shuffle
  • Compute a hash of the sequence, store it in a std::set
  • Discard if the hash is already present

I fail to see how using a custom generator could guarantee that the sequence is unique.



来源:https://stackoverflow.com/questions/6931951/how-to-make-sure-that-stdrandom-shuffle-always-produces-a-different-result

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!