在最近的一場CF的題解中,提到了這篇blog:Don't use rand(): a guide to random number generators in C++算法
大概概述一下這篇神仙blog說了啥:windows
那麼如何正確地生成一個隨機數呢?神仙blog提供了這樣一個東西:
這個奇葩的名字來自於它使用的算法——Mersenne Twister算法,以及它用到的質數——\(2^{19937} - 1\)。dom
怎麼用呢?ide
mt19937 rng(seed); printf("%u\n", rng());
上面那句至關於srand(seed),而後調用你定義的rng()能夠得到一個unsigned int類型的隨機數。函數
若是你要生成unsigned long long 類型的話,使用mt19937_64便可。ui
那麼怎麼替代random_shuffle()呢?使用shuffle()函數,把你的mt19937傳進去,像這樣:spa
shuffle(a, a + n, rng);
這樣就能讓數組內的元素移動足夠大的距離——讓shuffle更隨機了。code
附:完整生成隨機數代碼blog
#include <cstdio> #include <chrono> #include <random> using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int main(){ printf("%u\n", rng()); return 0; }