std::random_shuffle 產生不重複的隨機亂數

本篇介紹 C++ 的 std::random_shuffle 用法,並使用 std::random_shuffle 來產生不重複的隨機亂數,在一些情形下很需要使用到不重複的隨機亂數,趕快來學習吧。

實際應用案例

之前用 Qt 寫音樂播放器時,要實現隨機播下一首的功能,
就需用產生不重複的隨機亂數,這樣每次下一首個才會不重複到,就順便記錄下來吧。

需要引入的標頭檔<algorithm>

使用範例

std-random_shuffle.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// g++ std-random_shuffle.cpp -o a.out -std=c++11
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>

using namespace std;

int myrandom (int i) { return std::rand() % i; }

int main() {

vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

cout << "list : ";
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;

//std::srand(unsigned(std::time(0)));
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::srand(seed);

// 方法1 沒使用std::srand的話每次亂數結果都一樣
std::random_shuffle(vec.begin(), vec.end()); // using built-in random generator

// 方法2 沒使用std::srand的話每次亂數結果都一樣
//std::random_shuffle(vec.begin(), vec.end(), myrandom);

//default_random_engine defaultEngine; // 沒帶入種子的話每次亂數結果都一樣
//std::shuffle(vec.begin(), vec.end(), defaultEngine);

// 方法3, 使用系統時鐘作為種子
//unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
//std::shuffle(vec.begin(), vec.end(), std::default_random_engine(seed));

// 方法4
//std::random_device rd;
//std::shuffle(vec.begin(), vec.end(), std::default_random_engine(rd()));

// 方法5
//std::random_device rd;
//std::mt19937 g(rd());
//std::shuffle(vec.begin(), vec.end(), g);

cout << "result: ";
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;

return 0;
}

輸出

1
2
list  : 1 2 3 4 5 6 7 8 9 10 
result: 6 4 1 3 2 7 10 8 5 9

參考
[1] std::random_shuffle, std::shuffle - cppreference.com
https://en.cppreference.com/w/cpp/algorithm/random_shuffle
[2] random_shuffle - C++ Reference
http://www.cplusplus.com/reference/algorithm/random_shuffle/
[3]【C++ STL应用与实现】64: 如何使用shuffle和random_shuffle : 洗牌 (since C++11)
https://elloop.github.io/c++/2015-12-24/learning-using-stl-5-std-shuffle
[4] C++11 的 Random library, 你還在用rand()嗎? | Chino’s
http://chino.taipei/note-2016-1020C-11-%E7%9A%84-Random-library-%E4%BD%A0%E9%82%84%E5%9C%A8%E7%94%A8rand-%E5%97%8E/

其它相關文章推薦
C/C++ 新手入門教學懶人包
std::thread 用法與範例
std::deque 用法與範例
std::find 用法與範例
std::mutex 用法與範例
std::unordered_map 用法與範例
std::sort 用法與範例
std::shared_ptr 用法與範例
std::async 用法與範例