C++每日练笔之扩展随机数函数

众所周知C++中没有真正的产生随机数的函数,其rand()函数是一个伪随机数函数,知足不了一些须要。所以,本人扩展了几个函数,并放入命名空间TYCppStdLib中。数组

源代码以下:dom

 

/*- ==========================================================
*     文件名  :RandomFunc.h
*     开发人员:袁培荣
*     当前版本:1.0.0.2595
*     建立时间:2012-04-29
*     修改时间:2012-04-29
*     功能说明:产生随机数的函数
*     版权说明:版权全部 袁培荣 YuanPeirong 
*     编译环境:Windows 7(x64) SP1 简体中文专业版
*     编译器:  Visual Studio 2010 SP1(中文旗舰版)
                MinGW 20111108
                Visual C++ 6.0 SP6(中文企业版)
- ==========================================================*/

#ifndef RandomFunc_H_TYCppStdLib
#define RandomFunc_H_TYCppStdLib

#ifdef RandomFunc_DLL_API
#else
#define RandomFunc_DLL_API _declspec(dllimport)
#endif

#include <cstdlib>
#include <ctime>


namespace TYCppStdLib
{   
    //产生一个随机整数
    RandomFunc_DLL_API int Random(
        int minValue,        //设置数据的最大值(包含)
        int maxValue         //设置数据的最大值(包含)
    );
    
    //产生随机纯小数
    RandomFunc_DLL_API double Random(
        double minValue=0,   //设置数据的最小值(包含)
        double maxValue=1,   //设置数据的最大值(包含)
        bool get0and1=false  //指明是否能够产生0和1
    );
    
    //产生一组随机整数
    RandomFunc_DLL_API bool Random(
        int *data,           //用于存放产生的整数的数组首地址 
        int num,             //设置要产生的数据个数
        int minValue=-32768, //设置数据的最小值(包含)
        int maxValue=32767,  //设置数据的最大值(包含)
        bool different=false //设置数据是否要互不相同
    );
    
    
    //如下的函数是正确的,只是将数组形参写成指针形式更好,所以弃用
    // 产生一组随机整数
    // bool Random(
            // int data[],          //用于存放产生的整数的数组首地址 
            // int num,             //设置要产生的数据个数
            // int minValue=-32768, //设置数据的最小值(包含)
            // int maxValue=32767,  //设置数据的最大值(包含)
            // bool different=false //设置数据是否要互不相同
    // );
}

#endif

/*- ==========================================================
*     文件名  :RandomFunc.cpp
*     开发人员:袁培荣
*     当前版本:1.0.0.2595
*     建立时间:2012-04-29
*     修改时间:2012-04-29
*     功能说明:产生随机数的函数
*     版权说明:版权全部 袁培荣 YuanPeirong 
*     编译环境:Windows 7(x64) SP1 简体中文专业版
*     编译器:  Visual Studio 2010 SP1(中文旗舰版)
                MinGW 20111108
                Visual C++ 6.0 SP6(中文企业版)
- ==========================================================*/

#ifndef RandomFunc_DLL_ForAPI
#define RandomFunc_DLL_ForAPI

#define RandomFunc_DLL_API _declspec(dllexport)

#endif

#include "../Include/RandomFunc.h"

using std::srand;
using std::rand;
using std::time;

int TYCppStdLib::Random(int minValue, int maxValue)
{
    if(maxValue<minValue)
        return 0;//return false;
    if(minValue<-32768)
        minValue=-32768;
    if(maxValue>32767)
        maxValue=32767;
    int ix;
    static bool randomFisrt=true;
    if(randomFisrt)
        srand(time(NULL));
    randomFisrt=false;
    ix=rand();
    ix=ix%(maxValue-minValue+1)+minValue;
    return ix;
}

double TYCppStdLib::Random(double minValue, double maxValue, bool get0and1)
{
    if(maxValue<minValue)
        return 0;//return false;
    if(minValue<0)
        minValue=0;
    if(maxValue>1)
        maxValue=1;
    double dx;
    int ix1, ix2;
    ix1=(int)(minValue*32767);
    ix2=(int)(maxValue*32767);
    ix1=Random(ix1, ix2);
    if(false==get0and1 && 0==minValue && 1==maxValue)
    {
        if(!ix1)
            ix1=1;
        if(ix1==32767)
            ix1=32766;
    }
    dx=(double)(ix1)/32767;
    return dx;
}

bool TYCppStdLib::Random(int *data, int num, int minValue, int maxValue, bool different)
{

    if(num<1 || maxValue<minValue)
        return false;
    if(minValue<-32768)
        minValue=-32768;
    if(maxValue>32767)
        maxValue=32767;
    if(different && (maxValue-minValue+1)<num)
        return false;
    int ii, ij, ix;
    for(ii=0;ii<num;ii++)
    {
        while(1)
        {
            ix=Random(minValue, maxValue);
            if(!different)
                break;
            for(ij=0;ij<ii;ij++)
            {
                if(ix==*(data+ij))
                    break;
            }
            if(ij==ii)
                break;
        }
        *(data+ii)=ix;
    }
    return true;
}



//如下的函数是正确的,只是将数组形参写成指针形式更好,所以弃用
// 产生一批随机整数
// bool Random(
    // int data[], //用于存放产生的整数的数组
    // int num,    //设置要产生的数据个数
    // int minValue=-32768, //设置数据的最小值(包含)
    // int maxValue=32767,//设置数据的最大值(包含)
    // bool different=false //设置数据是否要互不相同
// );

// bool Random(int data[], int num, int minValue, int maxValue, bool different)
// {

    // if(num<1 || maxValue<minValue)
        // return false;
    // if(minValue<-32768)
        // minValue=-32768;
    // if(maxValue>32767)
        // maxValue=32767;
    // if(different && (maxValue-minValue+1)<num)
        // return false;
    // int ii, ij=0, ix;
    // for(ii=0;ii<num;ii++)
    // {
        // while(1)
        // {
            // ix=Random(minValue, maxValue);
            // if(!different)
                // break;
            // for(ij=0;ij<ii;ij++)
            // {
                // if(ix==data[ij])
                    // break;
            // }
            // if(ij==ii)
                // break;
        // }
        // data[ii]=ix;
    // }
    // return true;
// }
相关文章
相关标签/搜索