zoukankan      html  css  js  c++  java
  • 生成随机数的三种方法


    第一种最简单:利用STL的set容器

    #include <set>
    using namespace std;

    class IntSet
    {
    public:
        IntSet(int no, int maxval):no_(no), maxval_(maxval) {}
        int size() {return s_.size();}
        void generate()
        {
            while(s_.size() < no_)
            {
                s_.insert((rand() + 100)%maxval_);
            }
        }
        void disp()
        {
            set<int>::const_iterator it;
            for(it = s_.begin(); it != s_.end(); it++)
            {
                cout<<*it<<endl;
            }
        }
    private:
        set<int> s_;
        int no_;
        int maxval_;
    };

    int main()
    {
        IntSet iset(10, 100);
        iset.generate();
        iset.disp();
        return 0;
    }



    第二种利用数组(因为要求输出的随机数是有序的)效率最低!

    #include <memory>
    #include <ctime>
    using namespace std;

    const int MAXVAL = 100;

    void insert(int t, int*x, int n)
    {
        for(int i=0; i<=n; i++)
        {
            if(x[i] == MAXVAL)
                break;
        }
        for(int j=0; j<=i; j++)
        {
            if(x[j] > t)
                break;
        }
        for(int k=i; k>j; k--)
        {
            x[k+1] = x[k];
        }
        x[k] = t;
    }

    int main()
    {
        int* x = new int[10];
        memset(x, MAXVAL, 40);       // memset是逐个字节进行初始化
        srand(time(NULL));        // 产生随机数种子,必须放在for循环的外面
        for(int k=0; k<10; k++)
        {
            int val = rand()%MAXVAL;
            cout<<val<<endl;
            insert(val, x, 10);
        }

        cout<<"顺序输出如下:"<<endl;
        for(int i=0; i<10; i++)
        {
            cout<<x[i]<<endl;
        }
        return 0;
    }


    第三种利用链表,消耗的存储空间较大,但时间效率高!

    #include <ctime>
    using namespace std;

    struct node
    {
        int data;
        node* link;
        node(int val, node* p):data(val), link(p){}
    };

    class NodeList
    {
    public:
        NodeList() {first_ = new node(100, NULL);}
        void insert(node* p);
        void disp();
    private:
        node* first_;
    };

    void NodeList::insert(node* p)
    {
        node* tmp = first_;
        // 下面的判断条件需格外注意小心:如果是第一次插入
        // 或者插入元素小于第一个节点的值,则在第一个位置插入新元素
        if(tmp->link == NULL || (tmp->data > p->data))
        {
            p->link = tmp;
            first_ = p;
        }
        else
        {
            while(tmp->link != NULL)
            {
                if(tmp->link->data > p->data)
                {
                    p->link = tmp->link;
                    tmp->link = p;
                    break;
                }
                else
                {
                    tmp = tmp->link;
                }   
            }
        }
    }

    void NodeList::disp()
    {
        node* tmp = first_;
        while(tmp != NULL)
        {
            cout<<tmp->data<<endl;
            tmp = tmp->link;
        }
    }

    int main()
    {
        NodeList nl;
        // 产生随机数种子,必须放在for循环的外面
        srand(time(NULL));
        for(int k=0; k<10; k++)
        {
            int val = rand()%100;
            cout<<val<<endl;
            node* tmpnode = new node(val, 0);
            nl.insert(tmpnode);   
        }
        cout<<"链表排序后的随机数输出为:"<<endl;
        nl.disp();
        return 0;
    }



    2009、2、16  hekex1n

  • 相关阅读:
    【例题 6-21 UVA
    【例题 6-20 UVA
    【Codeforces Round #446 (Div. 2) C】Pride
    【Codeforces Round #446 (Div. 2) B】Wrath
    【Codeforces Round #446 (Div. 2) A】Greed
    【例题 6-19 UVA
    【CF675C】Money Transfers(离散化,贪心)
    【CF659E】New Reform(图的联通,环)
    【POJ1276】Cash Machine(多重背包单调队列优化)
    【HDU3507】Print Article(斜率优化DP)
  • 原文地址:https://www.cnblogs.com/kex1n/p/2286590.html
Copyright © 2011-2022 走看看