众所周知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; // }