生成随机数的三种方法


第一种最简单:利用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

posted @ 2009-02-16 20:37  小 楼 一 夜 听 春 雨  阅读(818)  评论(0编辑  收藏  举报