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;
// }
相關文章
相關標籤/搜索