在最近的一场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; }