关于rand()函数需要注意的地方

来源:互联网 发布:淘宝双十二有活动吗 编辑:程序博客网 时间:2024/05/07 19:36

    在用到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;

}

原创粉丝点击