随机数生成器

转自 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
",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
",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;
}
原文地址:https://www.cnblogs.com/Dxy0310/p/9871055.html