?? cl_my_rand.cpp
字號:
// ______________________ 完美隨機數 __________________________________ //
# ifndef _MY_RAND_NUM_
# define _MY_RAND_NUM_
# include<ctime>
# include<cstdlib>
# include<iostream>
# include<cmath>
using namespace std ;
enum Status { FAIL = -1 , OK = 0 , ERR = 1 };
class cl_my_rand
{
// 私有成員變量
private:
int min_num; // 隨機數序列的最小數
int max_num; // 隨機數序列的最大數
int num_num; // 隨機數序列的數的總個數
int loc_num; // 隨機數序列的當前隨機數的位置
int *buf_num; // 隨機數序列的存放緩沖
public:
public: // 公有函數和方法
cl_my_rand(){
min_num = 0 ;
max_num = 0 ;
num_num = 0 ;
loc_num = 0 ;
} ;
cl_my_rand( int min , int max );
~cl_my_rand(){
free( buf_num ) ;
min_num = 0 ;
max_num = 0 ;
num_num = 0 ;
loc_num = 0 ; };
Status Instance( int min , int max ); // 初始化隨機數實例
Status Instance();
Status ReInstance(); // 重新初始化隨機數序列
int GetMin(){ return min_num ; }; // 獲得最小的數字,下同
void Get_Min( int & min ) { min = min_num ; } ;
int GetMax(){ return max_num ; } ; // 獲得最大隨機數,下同
void Get_Max( int & max ){ max = max_num ; };
int GetLength(){ return num_num ; } ; // 獲得隨機數序列的長度
void Get_length( int & len ){ len = num_num ; };
int Rand(); // 產生隨機數
void Rand( int & num ); // 同上
private: // 私有成員函數
Status InitNum(); // 初始化緩沖區
void ChangeNum(); // 隨機交換緩沖區序列產生隨機數
};
cl_my_rand::cl_my_rand( int min , int max )
{
// 初始化基本私有變量
min_num = min ;
max_num = max ;
num_num = max - min + 1 ;
(num_num > 0 ) ? loc_num = 0 : loc_num = -1 ;
Instance() ;
}
Status cl_my_rand::Instance( )
{
if( InitNum() != OK ) return FAIL;
ChangeNum();
return OK;
}
Status cl_my_rand::Instance( int min , int max )
{
min_num = min ;
max_num = max ;
num_num = max - min + 1 ;
( num_num > 0 ) ? loc_num = 0 : loc_num = -1 ;
Instance();
}
Status cl_my_rand::InitNum()
{
if( num_num == 0 ) return FAIL;
if( min_num >= max_num ) return ERR;
if( NULL == (
buf_num = (
(int *)malloc ( num_num * sizeof ( int ) )
)
)
) return FAIL ;
for( int i = 0 ; i < num_num ; i = i + 1 )
{
buf_num[i] = min_num + i ;
}
return OK;
}
void cl_my_rand::ChangeNum()
{
int old_rand = 0 , new_rand = 0 ;
int temp = 0 ;
srand( time( NULL ));
new_rand = abs(rand() % num_num) ; // 將隨機交換的位置控制在序列個數之內
for( int i = 0 ; i < ( num_num * 4 ) ; i++ ) // 做序列個數次隨機交換
{
old_rand = new_rand ; // 提高隨機數的使用率(測試中)
new_rand = abs(rand() % num_num) ;
temp = buf_num[old_rand];
buf_num[old_rand] = buf_num[new_rand];
buf_num[new_rand] = temp ;
}
}
int cl_my_rand::Rand() // 產生隨機數
{
if( loc_num == -1 )
return 0;
else
{
loc_num = loc_num + 1 ;
return buf_num[loc_num - 1 ];
}
}
void cl_my_rand::Rand( int & num ) // 同上
{
if( loc_num == -1 )
{
num = 0 ;
return ;
}
num = buf_num[loc_num];
loc_num = loc_num + 1;
}
# endif // _MY_RAND_NUM_
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -