c 隨機排序容器中的元素

2022-01-10 08:55:06 字數 1629 閱讀 7245

在各種程式語言中都提供了將容器元素隨機排序的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 );

其中firstlast指定需要隨機排序的範圍,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::vectorstd::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 排序函式 預設公升...