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