Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::random_shuffle,std::shuffle

      From cppreference.com
      <cpp‎ |algorithm
       
       
      Algorithm library
      Constrained algorithms and algorithms on ranges(C++20)
      Constrained algorithms, e.g.ranges::copy,ranges::sort, ...
      Execution policies(C++17)
      Sorting and related operations
      Partitioning operations
      Sorting operations
      Binary search operations
      (on partitioned ranges)
      Set operations (on sorted ranges)
      Merge operations (on sorted ranges)
      Heap operations
      Minimum/maximum operations
      (C++11)
      (C++17)
      Lexicographical comparison operations
      Permutation operations
      C library
      Numeric operations
      Operations on uninitialized memory
       
      Defined in header<algorithm>
      template<class RandomIt>
      void random_shuffle( RandomIt first, RandomIt last);
      (1)(deprecated in C++14)
      (removed in C++17)
      (2)
      template<class RandomIt,class RandomFunc>
      void random_shuffle( RandomIt first, RandomIt last, RandomFunc& r);
      (until C++11)
      template<class RandomIt,class RandomFunc>
      void random_shuffle( RandomIt first, RandomIt last, RandomFunc&& r);
      (since C++11)
      (deprecated in C++14)
      (removed in C++17)
      template<class RandomIt,class URBG>
      void shuffle( RandomIt first, RandomIt last, URBG&& g);
      (3)(since C++11)

      Reorders the elements in the given range[firstlast) such that each possible permutation of those elements has equal probability of appearance.

      1) The source of randomness is implementation-defined, but the functionstd::rand is often used.
      2) The source of randomness is the function objectr.
      If any of the following conditions is satisfied, the behavior is undefined:
      • The return type ofr is not convertible tostd::iterator_traits<RandomIt>::difference_type.
      • Given a positive valuen of typestd::iterator_traits<RandomIt>::difference_type, the result ofr(n) is not a randomly chosen value in the interval[0n).
      3) The source of randomness is the objectg.
      Given the typeT asstd::remove_reference_t<URBG>, if any of the following conditions is satisfied, the behavior is undefined:
      (until C++20)

      Ifthe type of*first is notSwappable(until C++11)RandomIt is notValueSwappable(since C++11), the behavior is undefined.

      Contents

      [edit]Parameters

      first, last - the pair of iterators defining therange of elements to shuffle randomly
      r - function object returning a randomly chosen value
      g - generator object returning a randomly chosen value
      Type requirements
      -
      RandomIt must meet the requirements ofLegacyRandomAccessIterator.

      [edit]Complexity

      Exactlystd::distance(first, last)-1 swaps.

      [edit]Possible implementation

      See also the implementations inlibstdc++ andlibc++.

      random_shuffle (1)
      template<class RandomIt>void random_shuffle(RandomIt first, RandomIt last){typedeftypenamestd::iterator_traits<RandomIt>::difference_type diff_t; for(diff_t i= last- first-1; i>0;--i){usingstd::swap;        swap(first[i], first[std::rand()%(i+1)]);// rand() % (i + 1) is not actually correct, because the generated number is// not uniformly distributed for most values of i. The correct code would be// a variation of the C++11 std::uniform_int_distribution implementation.}}
      random_shuffle (2)
      template<class RandomIt,class RandomFunc>void random_shuffle(RandomIt first, RandomIt last, RandomFunc&& r){typedeftypenamestd::iterator_traits<RandomIt>::difference_type diff_t; for(diff_t i= last- first-1; i>0;--i){usingstd::swap;        swap(first[i], first[r(i+1)]);}}
      shuffle (3)
      template<class RandomIt,class URBG>void shuffle(RandomIt first, RandomIt last, URBG&& g){typedeftypenamestd::iterator_traits<RandomIt>::difference_type diff_t;typedefstd::uniform_int_distribution<diff_t> distr_t;typedeftypename distr_t::param_type param_t;     distr_t D;for(diff_t i= last- first-1; i>0;--i){usingstd::swap;        swap(first[i], first[D(g, param_t(0, i))]);}}

      [edit]Notes

      Note that the implementation is not dictated by the standard, so even if you use exactly the sameRandomFunc orURBG (Uniform Random Number Generator) you may get different results with different standard library implementations.

      The reason for removingstd::random_shuffle in C++17 is that the iterator-only version usually depends onstd::rand, which is now also discussed for deprecation. (std::rand should be replaced with the classes of the<random> header, asstd::rand isconsidered harmful.) In addition, the iterator-onlystd::random_shuffle version usually depends on a global state. Thestd::shuffle's shuffle algorithm is the preferred replacement, as it uses aURBG as its 3rd parameter.

      [edit]Example

      Randomly shuffles the sequence[110] of integers:

      Run this code
      #include <algorithm>#include <iostream>#include <iterator>#include <random>#include <vector> int main(){std::vector<int> v{1,2,3,4,5,6,7,8,9,10}; std::random_device rd;std::mt19937 g(rd());     std::shuffle(v.begin(), v.end(), g); std::copy(v.begin(), v.end(),std::ostream_iterator<int>(std::cout," "));std::cout<<'\n';}

      Possible output:

      8 6 10 4 2 3 7 1 9 5

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      LWG 395C++98the source of randomness of overload(1) was not specified, and
      std::rand could not be the source due to the C library requirement
      it is implementation-defined,
      and usingstd::rand is allowed
      LWG 552
      (N2423)
      C++98r was not required to be the source
      of randomness of overload(2)[1]
      required
      1. Overload(3) has the same defect, but that part of the resolution is not applicable to C++98.

      [edit]See also

      generates the next greater lexicographic permutation of a range of elements
      (function template)[edit]
      generates the next smaller lexicographic permutation of a range of elements
      (function template)[edit]
      randomly re-orders elements in a range
      (algorithm function object)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/algorithm/random_shuffle&oldid=180381"

      [8]ページ先頭

      ©2009-2025 Movatter.jp