C++每日练笔之扩展随机数函数
众所周知C++中没有真正的产生随机数的函数,其rand()函数是一个伪随机数函数,满足不了一些需要。因此,本人扩展了几个函数,并放入命名空间TYCppStdLib中。
源代码如下:
1 /*- ========================================================== 2 * 文件名 :RandomFunc.h 3 * 开发人员:袁培荣 4 * 当前版本:1.0.0.2595 5 * 创建时间:2012-04-29 6 * 修改时间:2012-04-29 7 * 功能说明:产生随机数的函数 8 * 版权说明:版权所有 袁培荣 YuanPeirong 9 * 编译环境:Windows 7(x64) SP1 简体中文专业版 10 * 编译器: Visual Studio 2010 SP1(中文旗舰版) 11 MinGW 20111108 12 Visual C++ 6.0 SP6(中文企业版) 13 - ==========================================================*/ 14 15 #ifndef RandomFunc_H_TYCppStdLib 16 #define RandomFunc_H_TYCppStdLib 17 18 #ifdef RandomFunc_DLL_API 19 #else 20 #define RandomFunc_DLL_API _declspec(dllimport) 21 #endif 22 23 #include <cstdlib> 24 #include <ctime> 25 26 27 namespace TYCppStdLib 28 { 29 //产生一个随机整数 30 RandomFunc_DLL_API int Random( 31 int minValue, //设置数据的最大值(包含) 32 int maxValue //设置数据的最大值(包含) 33 ); 34 35 //产生随机纯小数 36 RandomFunc_DLL_API double Random( 37 double minValue=0, //设置数据的最小值(包含) 38 double maxValue=1, //设置数据的最大值(包含) 39 bool get0and1=false //指明是否可以产生0和1 40 ); 41 42 //产生一组随机整数 43 RandomFunc_DLL_API bool Random( 44 int *data, //用于存放产生的整数的数组首地址 45 int num, //设置要产生的数据个数 46 int minValue=-32768, //设置数据的最小值(包含) 47 int maxValue=32767, //设置数据的最大值(包含) 48 bool different=false //设置数据是否要互不相同 49 ); 50 51 52 //以下的函数是正确的,只是将数组形参写成指针形式更好,因此弃用 53 // 产生一组随机整数 54 // bool Random( 55 // int data[], //用于存放产生的整数的数组首地址 56 // int num, //设置要产生的数据个数 57 // int minValue=-32768, //设置数据的最小值(包含) 58 // int maxValue=32767, //设置数据的最大值(包含) 59 // bool different=false //设置数据是否要互不相同 60 // ); 61 } 62 63 #endif
1 /*- ========================================================== 2 * 文件名 :RandomFunc.cpp 3 * 开发人员:袁培荣 4 * 当前版本:1.0.0.2595 5 * 创建时间:2012-04-29 6 * 修改时间:2012-04-29 7 * 功能说明:产生随机数的函数 8 * 版权说明:版权所有 袁培荣 YuanPeirong 9 * 编译环境:Windows 7(x64) SP1 简体中文专业版 10 * 编译器: Visual Studio 2010 SP1(中文旗舰版) 11 MinGW 20111108 12 Visual C++ 6.0 SP6(中文企业版) 13 - ==========================================================*/ 14 15 #ifndef RandomFunc_DLL_ForAPI 16 #define RandomFunc_DLL_ForAPI 17 18 #define RandomFunc_DLL_API _declspec(dllexport) 19 20 #endif 21 22 #include "../Include/RandomFunc.h" 23 24 using std::srand; 25 using std::rand; 26 using std::time; 27 28 int TYCppStdLib::Random(int minValue, int maxValue) 29 { 30 if(maxValue<minValue) 31 return 0;//return false; 32 if(minValue<-32768) 33 minValue=-32768; 34 if(maxValue>32767) 35 maxValue=32767; 36 int ix; 37 static bool randomFisrt=true; 38 if(randomFisrt) 39 srand(time(NULL)); 40 randomFisrt=false; 41 ix=rand(); 42 ix=ix%(maxValue-minValue+1)+minValue; 43 return ix; 44 } 45 46 double TYCppStdLib::Random(double minValue, double maxValue, bool get0and1) 47 { 48 if(maxValue<minValue) 49 return 0;//return false; 50 if(minValue<0) 51 minValue=0; 52 if(maxValue>1) 53 maxValue=1; 54 double dx; 55 int ix1, ix2; 56 ix1=(int)(minValue*32767); 57 ix2=(int)(maxValue*32767); 58 ix1=Random(ix1, ix2); 59 if(false==get0and1 && 0==minValue && 1==maxValue) 60 { 61 if(!ix1) 62 ix1=1; 63 if(ix1==32767) 64 ix1=32766; 65 } 66 dx=(double)(ix1)/32767; 67 return dx; 68 } 69 70 bool TYCppStdLib::Random(int *data, int num, int minValue, int maxValue, bool different) 71 { 72 73 if(num<1 || maxValue<minValue) 74 return false; 75 if(minValue<-32768) 76 minValue=-32768; 77 if(maxValue>32767) 78 maxValue=32767; 79 if(different && (maxValue-minValue+1)<num) 80 return false; 81 int ii, ij, ix; 82 for(ii=0;ii<num;ii++) 83 { 84 while(1) 85 { 86 ix=Random(minValue, maxValue); 87 if(!different) 88 break; 89 for(ij=0;ij<ii;ij++) 90 { 91 if(ix==*(data+ij)) 92 break; 93 } 94 if(ij==ii) 95 break; 96 } 97 *(data+ii)=ix; 98 } 99 return true; 100 } 101 102 103 104 //以下的函数是正确的,只是将数组形参写成指针形式更好,因此弃用 105 // 产生一批随机整数 106 // bool Random( 107 // int data[], //用于存放产生的整数的数组 108 // int num, //设置要产生的数据个数 109 // int minValue=-32768, //设置数据的最小值(包含) 110 // int maxValue=32767,//设置数据的最大值(包含) 111 // bool different=false //设置数据是否要互不相同 112 // ); 113 114 // bool Random(int data[], int num, int minValue, int maxValue, bool different) 115 // { 116 117 // if(num<1 || maxValue<minValue) 118 // return false; 119 // if(minValue<-32768) 120 // minValue=-32768; 121 // if(maxValue>32767) 122 // maxValue=32767; 123 // if(different && (maxValue-minValue+1)<num) 124 // return false; 125 // int ii, ij=0, ix; 126 // for(ii=0;ii<num;ii++) 127 // { 128 // while(1) 129 // { 130 // ix=Random(minValue, maxValue); 131 // if(!different) 132 // break; 133 // for(ij=0;ij<ii;ij++) 134 // { 135 // if(ix==data[ij]) 136 // break; 137 // } 138 // if(ij==ii) 139 // break; 140 // } 141 // data[ii]=ix; 142 // } 143 // return true; 144 // }

浙公网安备 33010602011771号