在各種程式語言中都提供了將容器元素隨機排序的shuffle
方法,c++也不例外。
不過c++將shuffle
放在了中而不是像其他語言一樣在
random
裡,同時c++17刪除了原先的random_shuffle
新的程式應該使用c++11新增進去的std::shuffle
。其中乙個好處是新的函式在可以自定義隨機數生成方法的同時保證了更好的安全性。
先來看下新函式的原型:
template< class randomit, class urbg >
void shuffle( randomit first, randomit last, urbg&& g );
其中first
和last
指定需要隨機排序的範圍,g
是乙個「uniformrandombitgenerator」,就是乙個可以產生規定範圍內的隨機數的可呼叫物件。
所以g
可以是std::random_device
或者像std::default_random_engine
這樣的隨機數引擎,也可以是std::mt19937
這樣的標準庫提供的隨機數生成器的物件,它們都在中。
shuffle
呼叫後目標容器內的元素排列順序會被隨機打亂,我們看個例子。
首先是兩個幫助函式,避免做一些重複勞動:
// 幫助函式,列印vector的內容
template std::ostream &operator<
os << "}";
return os;
}// 幫助函式,生成乙個符合uniformrandombitgenerator要求的隨機數生成器;
// std::random_device雖然符合要求但是只適合於生成seed及安全要求較高的場合,因為速度可能很慢。
// 所以我們選擇std::mt19937演算法,你可以自己選擇其他合適的演算法
auto get_urbg()
然後我們分別打亂乙個std::vector
和std::vector
容器內元素的排列順序:
// 隨機排序容器內元素,列印隨機排序前和隨機排序後的容器內容
template void shuffle_container(std::vector&container)
int main()
; shuffle_container(ivec);
// 分割線
std::cout << std::string(40, '-') << std::endl;
std::vectorsvec;
shuffle_container(svec);
}
我們編譯寫好的程式,然後執行:
可以看到元素都已經被隨機排序了。
從python容器中隨機選取元素
1 1.使用python random模組的choice方法隨機選擇某個元素 2import random 34 foo a b c d e 5from random import choice67 print choice foo 89 2.使用python random模組的sample函式從列...
陣列元素的隨機排序
function randomorder targetarray var arraylength targetarray.length 目標陣列的長度 var temparray1 new array 先建立乙個正常順序的陣列 for var i 0 i arraylength i 將目標陣列的元素...
C 容器 排序
首先關於list容器做個簡要介紹 list容器中的資料是鏈式儲存,動態分配儲存,不會造成記憶體浪費和溢位 可對任意位置進行快速插入和刪除 不支援隨機訪問迭代器 因為對所有不支援隨機訪問迭代器的容器,不可以用標準演算法,但list內部提供對應一些演算法,比如排序演算法 l.sort 排序函式 預設公升...