• 随机数生成器


    转自 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;
    }
  • 相关阅读:
    linux系统中sed命令删除指定行后的下一行
    linux系统中删除文件的最后几行
    linux系统中sed命令删除指定行及其后的若干行
    linux系统中sed命令整行替换
    linux系统中sed命令在指定行前(后)插入内容
    CVE-2010-3333-office RTF栈溢出漏洞分析
    BM 算法
    HDFS 的 API 操作
    linux 服务器使用百度网盘
    linux 下配置java JDK1.8
  • 原文地址:https://www.cnblogs.com/Dxy0310/p/9871055.html
Copyright © 2020-2023  润新知