fork download
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <iterator>
  4. #include <random>
  5. #include <vector>
  6.  
  7. int main()
  8. {
  9. // seed the RNG
  10. std::random_device rd;
  11. std::mt19937 mt(rd());
  12.  
  13. std::vector<int> elements { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  14.  
  15. std::cout << "Before: ";
  16. std::copy(elements.cbegin(), elements.cend(),
  17. std::ostream_iterator<int>(std::cout, " "));
  18.  
  19. auto currentIndexCounter = elements.size();
  20.  
  21. for (auto iter = elements.rbegin(); iter != elements.rend();
  22. ++iter, --currentIndexCounter)
  23. {
  24. // get int distribution with new range
  25. std::uniform_int_distribution<> dis(0, currentIndexCounter);
  26. const int randomIndex = dis(mt);
  27.  
  28. if (*iter != elements.at(randomIndex))
  29. {
  30. std::swap(elements.at(randomIndex), *iter);
  31. }
  32. }
  33.  
  34. std::cout << "\nAfter: ";
  35. std::copy(elements.cbegin(), elements.cend(),
  36. std::ostream_iterator<int>(std::cout, " "));
  37. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
Before: 1 2 3 4 5 6 7 8 9 
After: 7 9 3 2 4 5 6 1 8