| 
 
前三句等价为:
 
float fRetVal = (float)rand()*(float)nMax / RAND_MAX + 0.5f; rand()显然是不超过RAND_MAX的,所以nMax就是所能取到的最大值,0.5f是为了达到四舍五入的效果。  | 
|
| 
 
rand产生数在[0,max]之间,假设在之间为均匀,显然要产生fmap=1.0的概率为1/max,如有4为例,要产生4概率也同样为1/max,而均匀要求为1/4,显然不是等概率的,应该是rand()%4+1才对 
 | 
|
| 
 
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c
 
/***
*rand.c - random number generator
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines rand(), srand() - random number generator
*
*******************************************************************************/
#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>
/***
*void srand(seed) - seed the random number generator
*
*Purpose:
*       Seeds the random number generator with the int given.  Adapted from the
*       BASIC random number generator.
*
*Entry:
*       unsigned seed - seed to seed rand # generator with
*
*Exit:
*       None.
*
*Exceptions:
*
*******************************************************************************/
void __cdecl srand (
        unsigned int seed
        )
{
        _getptd()->_holdrand = (unsigned long)seed;
}
/***
*int rand() - returns a random number
*
*Purpose:
*       returns a pseudo-random number 0 through 32767.
*
*Entry:
*       None.
*
*Exit:
*       Returns a pseudo-random number 0 through 32767.
*
*Exceptions:
*
*******************************************************************************/
int __cdecl rand (
        void
        )
{
        _ptiddata ptd = _getptd();
        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );
}
 | 
|
| 20分 | 
 
搜“线性同余”? 
 | 
| 
 
+0.5不是表示四舍五入啊,看运行结果,只是加了个单精度浮点类型的0.5。 
 | 
|
| 
 
我开始的这个算法也可以实现求1到nMax之间的随机数,但是这个是我在网上找的,,有的不明白这个的原理,+0.5是为什么。还有最后求得的是0到nMax之间的随机数还是1到nMax之间的随机数?求解释 
 | 
|
| 
 把fRetVal改成int型的再看看效果  | 
|
| 20分 | 
 
[0,3]的话 rand() % 4 
[1,4]的话 rand() % 4 + 1 在rand()分布均匀的情况下可以保证其分布是均匀的 如果范围不是32768的约数那么应该尽量不用rand() 如果是C++11以上有 <random> 备用的有 <boost/random>  |