一个方便的随机数类

该博客主要展示了CRnd类的实现,该类用于产生某个区间的随机数。包含了类的定义和成员函数的实现,可根据区间最小值、最大值以及是否类似正弦分布来生成随机数,支持int和float类型。

#if !defined(AFX_RND_H__13D8F365_1AAD_49C1_8EA8_BE0AB3681FFA__INCLUDED_)
#define AFX_RND_H__13D8F365_1AAD_49C1_8EA8_BE0AB3681FFA__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CRnd 
{
public:
 CRnd();
 virtual ~CRnd();
/*! @function
********************************************************************************
<PRE>
函数名   : GetRand
功能     : 产生某个区间的随机数
参数     : [IN]  nMin       :区间最小值
   [IN]  nMax    : 区间最大值
   [IN]  bLikeSinusoid : 是否类似正弦分布
返回值   : 符合条件的随机数
抛出异常 : -
--------------------------------------------------------------------------------
备注     :
典型用法 : int rnd = CRnd::GetRand(0,100);
--------------------------------------------------------------------------------
</PRE>
*******************************************************************************/
 static int GetRand(int nMin,int nMax,BOOL bLikeSinusoid=FALSE);
/*! @function
********************************************************************************
<PRE>
函数名   : GetRand
功能     : 产生某个区间的随机数
参数     : [IN]  nMin       :区间最小值
   [IN]  nMax    : 区间最大值
   [IN]  bLikeSinusoid : 是否类似正弦分布
返回值   : 符合条件的随机数
抛出异常 : -
--------------------------------------------------------------------------------
备注     :
典型用法 : int rnd = CRnd::GetRand(0,100);
--------------------------------------------------------------------------------
</PRE>
*******************************************************************************/
 static float GetRand(float fMin,float fMax,BOOL bLikeSinusoid=FALSE);
private:
 static unsigned int s_seed;
};

#endif // !defined(AFX_RND_H__13D8F365_1AAD_49C1_8EA8_BE0AB3681FFA__INCLUDED_)

// Rnd.cpp: implementation of the CRnd class.
//
//////////////////////////////////////////////////////////////////////
/*! @file
  ********************************************************************************
<PRE>
模块名         : 随机函数产生类实现文件
文件名         : Rnd.cpp
相关文件       : Rnd.h
文件实现功能   : 实现产生随机函数的静态函数
作者           : Duan Jihua
版本           : 1.0
--------------------------------------------------------------------------------
备注           : -
--------------------------------------------------------------------------------
修改记录 :
日  期          版本            修改人          修改内容
2005/08/16      1.0        Duan Jihua            创建
</PRE>
********************************************************************************
* 版权所有(c) 2005, Duan Jihua, 保留所有权利
*******************************************************************************/


#include "stdafx.h"
#include "Rnd.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
unsigned int CRnd::s_seed=NULL;
CRnd::CRnd()
{
}

CRnd::~CRnd()
{

}
int CRnd::GetRand(int nMin,int nMax,BOOL bLikeSinusoid)
{
 if (s_seed == NULL) {
  s_seed = (unsigned int) time(NULL);
  srand(s_seed);
 }
 if (! bLikeSinusoid) {
//  return nMin + (int)((nMax - nMin) * (rand() * 1.0 / RAND_MAX )) ;
  return nMin + rand() % (nMax - nMin);
 }
 else{
  return nMin + (int)((nMax - nMin) * sin(rand() * 1.0 / RAND_MAX ) );
 }
}
float CRnd::GetRand(float fMin,float fMax,BOOL bLikeSinusoid)
{
 if (s_seed == NULL) {
  s_seed = (unsigned int) time(NULL);
  srand(s_seed);
 }
 if (! bLikeSinusoid) {
  return fMin +(float) ((fMax - fMin) * (rand() * 1.0 / RAND_MAX )) ;
 }
 else{
  return fMin + (float)((fMax - fMin) * sin(rand() * 1.0 / RAND_MAX )) ;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值