随机数生成器
转自 lyd 《算法竞赛进阶指南》
头文件 <cstdlib>
内容 rand,srand函数和RAND_MAX常量
RAND_MAX 在Windows系统中为32767 ,在类Unix系统中为2147483647
rand()函数返回一个0~RAND_MAX的随机整数
srand(seed)函数 接受unsigned int 类型的参数seed,以seed为随机种子,rand()基于此生成随机数,如果不写srand函数,则种子默认为1
若要产生随机实数,先产生较大的随机整数
1.随机生成整数序列
随机生成 n<=10^5个绝对值在10^9之内的整数
//随机生成整数序列 #include<bits/stdc++.h> using namespace std; #define maxn 100000+10 int a[maxn]; int random(int n) { return (long long) rand()*rand()%n; } int main() { srand((unsigned) time(0)); int n=random(100000)+1; int m=1000000000; for(int i=1;i<=n;i++) a[i]=random(2*m+1)-m;//-m ~ m间的数 for(int i=1;i<=n;i++) cout<<a[i]<<endl; return 0; }
2.随机生成区间列
随机生成 m个 [1,n]的子区间,这些区间可作为数据结构题目的操作序列
//随机生成区间列 #include<bits/stdc++.h> using namespace std; #define maxn 100000+10 int random(int n) { return (long long) rand()*rand()%n; } int main() { int n=10; int m=20; for(int i=1;i<=m;i++) { int l=random(n)+1; int r=random(n)+1; if(l>r) swap(l,r); printf("%d %d\n",l,r); } return 0; }
3.随机生成树
随机生成一棵n个节点的树,用n个点,n-1条无向边形式输出,每条边附带一个10^9以内的权值
//随机生成树 #include<bits/stdc++.h> using namespace std; #define maxn 100000+10 int random(int n) { return (long long) rand()*rand()%n; } int main() { int n=1000; for(int i=2;i<=n;i++) { int fa=random(i-1)+1; int val=random(1000000000)+1; printf("%d %d %d\n",fa,i,val); } return 0; }
4.随机生成图
随机生成一张n个点m条边的无向图,图中不存在重边自环,且必须连通,保证 5<=n<=m<=n*(n-1)/4<=10^6
//随机生成图 #include<bits/stdc++.h> using namespace std; #define maxn 10000 int n,m; pair<int,int> e[maxn]; map< pair<int,int>,bool > h; int random(int x) { return (long long) rand()*rand()%n; } int main() { srand((unsigned)time(0)); scanf("%d%d",&n,&m); for(int i=1;i<n;i++) { int fa=random(i)+1; e[i]=make_pair(fa,i+1); h[e[i]]=h[make_pair(i+1,fa)]=1; } for(int i=n;i<=m;i++) { int x,y; do { x=random(n)+1; y=random(n)+1; }while(x==y||h[make_pair(x,y)]); e[i]=make_pair(x,y); h[e[i]]=h[make_pair(y,x)]=1; } random_shuffle(e+1,e+1+m); for(int i=1;i<=m;i++) { cout<<e[i].first<<" "<<e[i].second<<endl; } return 0; }