當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


C++ Algorithm random_shuffle()用法及代碼示例


C++ 算法 random_shuffle() 通過將範圍內的元素放在隨機位置來重新排序。

第一個版本使用內部隨機數生成器,第二個版本使用隨機數生成器,它是一種特殊類型的函數對象,顯式作為參數傳遞。

用法

generator by default (1)	

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

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

參數

first:一個隨機訪問迭代器,指向要重新排列的範圍中第一個元素的位置。

last:一個隨機訪問迭代器,指向要重新排列的範圍中最後一個元素的位置。

result:一個輸出迭代器,指向目標範圍中第一個元素的位置。

gen: 一個稱為隨機數生成器的特殊函數對象。

返回值

複雜度

複雜度在 [first, last) 範圍內是線性的:獲取隨機值並交換元素。

數據競爭

範圍 [first, last) 中的對象被修改。

結果和返回值之間範圍內的對象發生了變化。

異常

如果元素交換的任何隨機數生成或迭代器上的操作引發異常,則此函數將引發異常。

請注意,無效參數會導致未定義的行為。

例子1

讓我們看一個簡單的例子來演示 random_shuffle() 的使用:

#include <iostream>
#include <vector> 
#include <algorithm>
#include <numeric>
#include <iterator>

using namespace std;

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

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

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

  cout << " after:";
  copy(v.begin(), v.end(), ostream_iterator<int>(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 <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main()
{
  int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  vector<int> v(a, a+10);
 
  cout <<"Here are the values in the vector:\n";
  for (vector<int>::size_type i=0; i<v.size(); i++)
    cout <<v.at(i)<<" ";
 
  cout << "\n\nNow we randomize the order of the values.";
  random_shuffle(v.begin(), v.end());
 
  cout <<"\n\nHere are the revised contents of the vector:\n";
  for (vector<int>::size_type i=0; i<v.size(); i++)
    cout <<v.at(i)<<" ";
 
  return 0;
}

輸出:

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 <iostream>
#include <algorithm>
#include <vector>
#include <iomanip>
using namespace std;
 
void print(vector <string> vs)
{   
    vector <string>::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 <string> 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 <iostream>     // std::cout
#include <algorithm>    // std::random_shuffle
#include <vector>       // std::vector
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand

using namespace std;

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

int main () {
  srand ( unsigned ( time(0) ) );
  vector<int> 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<int>::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





相關用法


注:本文由純淨天空篩選整理自 C++ Algorithm random_shuffle()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。