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

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

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

 

 

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

 

rand.h

//-------Created By 九天雁翎(jtianling) Email:jtianling@gmail.com

//-------最后修改时间:.3.26

 

 

#ifndef RAND_H

#define RAND_H

 

namespace jtianling

{

    //此算法只保证范围,还是需要自己设定种子

    //此算法生成从lowBorderhighBorder的随机数,而且包括边界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

{

    //此算法生成从ij的随机数,而且包括边界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详尽研究 个人认为最后一些内容有待商酌 后一篇: 几种典型算法的快速比较函数