九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

几个关于随机数组产生的函数 包括各类可重复或不重复

几个关于随机数组产生的函数 包括各类可重复或不重复

使用方法都比较简单,也不多说了,无非就是用一个数组和一个表示数组大小的整数来调用,这里要说明的是,你必须保证数组的大小要足够,其他的函数的作用可以参考具体文件的注释,我个人觉得够详细了

rand.h

//-------Created By 九天雁翎(jtianling) Email:jtianling@gmail.com
//-------最后修改时间:.3.26


#ifndef RAND_H
#define RAND_H

namespace jtianling
{
    //此算法只保证范围,还是需要自己设定种子
    //此算法生成从lowBorder到highBorder的随机数,而且包括边界lowBorder,highBorder.
    //即lowBorder=<n<=highBorder
    int RandIntInRange(int lowBorder, int highBorder);

    //算法描述如<<Data Structures and Algorithm Analysis in C++>>
    //By Mark Allen Weiss 题目.8算法所示,根据习惯,不对outArray[]的大小做任何检验,
    //调用此函数的人应该确保这一点,即outArray的大小大于等于numOfArray
    //此算法的用途是高效地产生一个不重复的随机序列
    //且此序列正好包括(1,numOfArray)中所有自然数
    void RandArrayNoRepeatInN(int outArray[], int numOfArray);

    //此算法产生随机的不重复的数组,数组大小为N
    //利用set容器的特性来保证没有重复,因为set容器的查找远快于一个一个查找
    //所以此方法比<<Data Structures and Algorithm Analysis in C++>>
    //By Mark Allen Weiss 题目.8算法所示算法快,而且增长慢很多
    void RandArrayNoRepeat(int outArray[], int numOfArray);

    //产生一个的随机序列且此序列的数值只在(1,numOfArray)中
    void RandArrayInN(int outArray[], int numOfArray);

    //产生一个随机的序列,且序列的值为完全随机,序列的大小由numOfArray指定
    void RandArray(int outArray[], int numOfArray);

} //end of namespace jtianling


#endif

rand.cpp

//-------Created By 九天雁翎(jtianling) Email:jtianling@gmail.com
//-------最后修改时间:.3.28
#include "rand.h"
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <set>

namespace jtianling
{
    //此算法生成从i到j的随机数,而且包括边界i,j.即i=<n<=j
    int RandIntInRange(int i, int j)
    {
        //确保i<j,不然就交换
        if(i > j)
        {
            int temp = i;
            i = j;
            j = temp;
        }
        //确保范围正确
        return rand()%(j-i+1) + i;
    }

    //算法描述如<<Data Structures and Algorithm Analysis in C++>>
    //By Mark Allen Weiss 题目.8算法所示,根据习惯,不对arr[]的大小做任何检验,
    //调用此函数的人应该确保这一点,即arr的大小大于等于n
    //此算法的用途是高效地产生一个不重复的随机序列
    //且此序列正好包括(1,n)中所有自然数
    void RandArrayNoRepeatInN(int arr[], int n)
    {
        srand( time(NULL) );
        for(int i=0; i<n; ++i)
        {
            arr[i] = i + 1;
        }
        for(int i=0; i<n; ++i)
        {
            std::swap(arr[i], arr[RandIntInRange(0, i)] );
        }
    }

    //此算法产生随机的不重复的数组,数组大小为N
    //利用set容器的特性来保证没有重复,因为set容器的查找远快于一个一个查找
    //所以此方法比<<Data Structures and Algorithm Analysis in C++>>
    //By Mark Allen Weiss 题目.8算法所示算法快,而且增长慢很多
    void RandArrayNoRepeat(int arr[], int n)
    {
        srand( time(NULL) );
        std::set<int> intSet;
        int temp;
        for(int i=0; i<n; ++i)
        {

            while(true)
            {
                temp = rand();
                if(!intSet.count(temp))
                {
                    arr[i] = temp;
                    intSet.insert(temp);
                    break;
                }
            }
        }
    }

    //产生一个的随机序列且此序列的数值只在(1,n)中,序列的大小由n指定
    void RandArrayInN(int arr[], int n)
    {
        srand( time(NULL) );
        for(int i=0; i<n; ++i)
        {
            arr[i] = RandIntInRange(0, n);
        }
    }

    //产生一个随机的序列,且序列的值为完全随机,序列的大小由n指定
    void RandArray(int arr[], int n)
    {
        srand( time(NULL) );
        for(int i=0; i<n; ++i)
        {
            arr[i] = rand();
        }
    }

} //end of namespace jtianling

分类:  我的程序 
标签:  随机数组 

Posted By 九天雁翎 at 九天雁翎的博客 on 2008年03月26日

前一篇: Effective C++ 第3版 Item 26详尽研究 个人认为最后一些内容有待商酌 后一篇: 几种典型算法的快速比较函数