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 // }

 

posted @ 2012-04-30 16:03  天远  阅读(301)  评论(0)    收藏  举报

版权所有 © 2010-2020 YuanPeirong TianYuan All Rights Reserved. Powered By 天远