random_shuffle

Posted tianzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了random_shuffle相关的知识,希望对你有一定的参考价值。

//版本一:使用内部的随机数生成器 
template<class RandomAccessIterator> 
   void random_shuffle( 
      RandomAccessIterator _first,  
      RandomAccessIterator _last 
   )
{
  __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  if (__first == __last) return;
  for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
    iter_swap(__i, __first + __random_number((__i - __first) + 1));
}
//版本二:是使用一个会产生随机数的仿函数
template<class RandomAccessIterator, class RandomNumberGenerator> 
   void random_shuffle( 
      RandomAccessIterator _first,  
      RandomAccessIterator _last,  
      RandomNumberGenerator& gen 
   )
{
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  if (__first == __last) return;
  for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
    iter_swap(__i, __first + __rand((__i - __first) + 1));

}

  随机重排[first,last)中的数据,有N!中可能,N=last-first,此算法会产生一种均匀分布任何特定排列顺序被选中的几率为1/N!版本二是一种特别的function object,当被引数传进来,传递方式是by reference,而不是by value,因为RandomNumberGenerator的重要特点是具有局部状态,每次被调用时被改变。

  使用乱数时,能够明白设定乱数产生器的种子是非常重要的,如果这对程序重要,则使用第二个版本。

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <ctime>
using namespace std;

class F
{
    public:
        ptrdiff_t operator()(ptrdiff_t max)
        {
            srand((unsigned)time(NULL));
            int _rand=static_cast<int>(rand()/static_cast<int>(RAND_MAX));
            return static_cast<ptrdiff_t>(_rand*max);
        }    
};
int main()
{
    vector<int> v{1,2,3,4,5,6};
    
    random_shuffle(v.begin(),v.end(),F());
    for_each(v.begin(),v.end(),[](int i)
    {
        cout<<i<<" ";
    });
    cout<<endl;
    return 0;
}

 

以上是关于random_shuffle的主要内容,如果未能解决你的问题,请参考以下文章

random_shuffle

C++常用算法random_shuffle

使用Fisher-Yates 洗牌算法实现random_shuffle函数

random_shuffle 和 srand() 每次都给我相同的结果

C++ STL应用与实现64: 如何使用shuffle和random_shuffle : 洗牌 (since C++11)

STL_算法_重排和分区(random_shufflepartitionstable_partition)