📜  C++ STL-algorithm.random_shuffle()函数

📅  最后修改于: 2020-10-17 04:25:20             🧑  作者: Mango

C++ STL algorithmrandom_shuffle()

C++ STL algorithm.random_shuffle()通过将范围中的元素放在随机位置来对它们进行重新排序。

第一个版本使用内部随机数生成器,第二个版本使用随机数生成器,这是一种特殊的函数对象,明确地将其作为参数传递。

句法

generator by default (1)    

template 
                 void random_shuffle (RandomAccessIterator first, RandomAccessIterator last);

specific generator (2)
    
template 
  void random_shuffle (RandomAccessIterator first, RandomAccessIterator last,
                       RandomNumberGenerator& gen);

参数

first:随机访问迭代器,指向要重新排列的范围内第一个元素的位置。

last:一个随机访问迭代器,将位置指向要重排范围中最后一个元素之后的位置。

结果:一个输出迭代器,该迭代器指向目标范围中第一个元素的位置。

gen:一种特殊函数对象,称为随机数生成器。

返回值

没有

复杂度

复杂度在[first,last)范围内是线性的:获取随机值并交换元素。

数据竞争

[first,last)范围内的对象被修改。

结果和返回值之间的范围内的对象被更改。

异常处理

如果元素交换的任何随机数生成或对迭代器的操作抛出异常,则此函数将引发异常。

请注意,无效的参数会导致未定义的行为。

例子1

让我们看一个简单的示例来演示random_shuffle()的用法:

#include 
#include  
#include 
#include 
#include 

using namespace std;

int main() {
  vector v(10); 
  iota(v.begin(), v.end(), 0);  //generating a value from 0-9

  cout << "before: ";
  copy(v.begin(), v.end(), ostream_iterator(cout, " "));
  cout << endl;

  random_shuffle(v.begin(), v.end());

  cout << " after: ";
  copy(v.begin(), v.end(), ostream_iterator(cout, " "));
  cout << endl;
  
  return 0;
}

输出:

before: 0 1 2 3 4 5 6 7 8 9 
after: 4 3 7 8 0 5 2 1 6 9

例子2

让我们看另一个简单的例子:

#include 
#include 
#include 
 
using namespace std;
 
int main()
{
  int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  vector v(a, a+10);
 
  cout <<"Here are the values in the vector:\n";
  for (vector::size_type i=0; i::size_type i=0; i

输出:

Here are the values in the vector:
1 2 3 4 5 6 7 8 9 10 

Now we randomize the order of the values.

Here are the revised contents of the vector:
5 4 8 9 1 6 3 2 7 10  

例子3

让我们看另一个简单的例子:

#include 
#include 
#include 
#include 
using namespace std;
 
void print(vector  vs)
{   
    vector ::iterator i;
    for(i = vs.begin(); i != vs.end(); i++)
    {
        cout << setw(2) << *i << "  ";
    }
    cout << endl;
}
 
int main()
{
    string s[] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
    vector  vs(s, s + 13);
 
    cout << "Original order : ";
    print(vs);
    cout << "Shuffling cards in uniformly random order ... "
         << endl;
    random_shuffle(vs.begin(), vs.end());
    cout << "Pick any three cards ... " << endl;
    cout << "You have got   : ";
    cout << vs.back() << ", ";
    vs.pop_back();
    cout << vs.back() << ", ";
    vs.pop_back();
    cout << vs.back() << endl;
    vs.pop_back();
    
    return 0;
}

输出:

Original order :  A   2   3   4   5   6   7   8   9  10   J   Q   K  
Shuffling cards in uniformly random order ... 
Pick any three cards ... 
You have got   : 9, 8, 4

例子4

让我们看另一个简单的例子:

#include      // std::cout
#include     // std::random_shuffle
#include        // std::vector
#include         // std::time
#include       // std::rand, std::srand

using namespace std;

// random generator function:
int myrandom (int i) { return rand()%i;}

int main () {
  srand ( unsigned ( time(0) ) );
  vector myvector;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

  // using built-in random generator:
  random_shuffle ( myvector.begin(), myvector.end() );

  // using myrandom:
  random_shuffle ( myvector.begin(), myvector.end(), myrandom);

  // print out content:
  cout << "myvector contains:";
  for (vector::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    cout << ' ' << *it;

  cout << '\n';

  return 0;
}

输出:

myvector contains: 9 7 5 6 3 4 2 8 1