在用到rand()函数时,需要注意以下几点:
1.程序开始时,使用srand(unsigned int)函数,设置一下随机种子,因为rand()是一个伪随机,一般使用系统时间 srand( (unsigned int)time(0) );
系统在调用rand()之前都会自动调用srand(),如果用户在rand()之前曾调用过srand()给参数seed指定了一个值,那么 rand()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始 值。如果给了一个定值,那么每次rand()产生的随机数序列都是一样的
2.rand()出来的值不会超过RAND_MAX,这个值一般为0x7ffff,因此如果要在一个超大的数中随机一个值,就需要做相应的处理,在此提供两种方式:
1. (int)(((double)rand()) / (double)RAND_MAX * N); N为你想扩大的倍数,但是此方法,如果扩大的倍数大于RAND_MAX的10的幂,则后面会以0补位,当然这种情况也不必太计较
2.以RAND_MAX为分割点
if ( max > RAND_MAX )
{
int nMulti = max / RAND_MAX;
int nMod = max % RAND_MAX;
int nRand = rand();
nRand *= nMulti;
nMod = rand()%nMod;
nRand += nMod;
return nRand;
}
3. 以10000为分割点,对数值进行拆分,分段随机,如1234567890 则分割为 12 3456 7890
int max = 1234567890;
const int randmax = 10000;
if ( max > randmax )
{
typedef std::list< std::pair<int,int> > RATE_LIST;
RATE_LIST vRate;
int nRate = 1;
int nTmp = max;
while ( true )
{
int nMod = nTmp % randmax;
if ( nMod > 0 )
{
if ( nMod < randmax )
nMod += randmax;
vRate.push_back( std::make_pair( nMod, nRate ) );
}
nRate *= randmax;
nTmp /= randmax;
if ( nTmp <= randmax )
{
if ( nTmp < 1 )
break;
vRate.push_back( std::make_pair( nTmp, nRate ) );
break;
}
}
RATE_LIST::iterator itr = vRate.begin();
RATE_LIST::iterator itrE = vRate.end();
int nRes = 0;
for ( ; itr!=itrE; ++itr )
{
int& nValue = itr->first;
int res = nValue * itr->second;
nRes += rand() % res;
}
return nRes;
}