若是想要出一套信息学竞赛模拟题, 或者要对拍以验证本身程序的正确性,数据生成器是必不可少的。c++
数据的随机性很重要。 只有足够随机的数据才能够均匀地覆盖到各类状况。算法
可是<cstdlib>
里的rand()
不是很好用:dom
在c++11
或以上的c++版本,能够使用更好的mt19937
随机化工具。函数
要: #include<random>
工具
它基于梅森素数,周期很是长,随机性也有保证。 只是稍慢一点。spa
咱们能够这样定义一个基于mt19937
的随机函数c++11
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); mt19937_64 rng2(chrono::steady_clock::now().time_since_epoch().count());
rng
的做用和rand()
相同, 不过须要注意:code
rng()
\(\in [0, 2^{32})\)rng2()
\(\in [0, 2^{64})\)chrono::steady_clock::now().time_since_epoch().count()
表示当前时间。 它是随机种子。class
//这样来生成一个 1 ~ n 的随机数 mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); #define ll long long ll rd(ll x) { return rng() % x + 1; }
for(int i = 2; i <= n; i++) { int u = rd(i-1); printf("%d %d\n", u, i); //(u, i) 为一条边的两个端点 }
set<pair<int, int> > st; for(int i = 2; i <= n; i++) { int u = rd(i-1); st.insert(make_pair(u, i)); }//先生成它的生成树 while(st.size() < m) { int u = rd(n), v = rd(n); if(u > v) swap(u, v); pair<int, int> pii = make_pair(u, v); if(u == v || st.find(pii) != st.end()) continue; st.insert(pii); } //这张图无重边和自环