Code Bye

想问问这个生成随机数(1到4)的函数的原理

MapRand(UINT nMax)        //随机函数
{
    int nRand=rand();                //rand返回值在0到RAND_MAX(32767)之间
    float fMap=(float)nMax/RAND_MAX;
    float fRetVal=(float)nRand*fMap+0.5f;
    return (UINT)fRetVal;
}

感觉这个函数随机生成的数的概率不相等??????

前三句等价为:
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之间的随机数?求解释
引用 5 楼 u011805719 的回复:

+0.5不是表示四舍五入啊,看运行结果,只是加了个单精度浮点类型的0.5。

把fRetVal改成int型的再看看效果

20分
[0,3]的话 rand() % 4
[1,4]的话 rand() % 4 + 1
在rand()分布均匀的情况下可以保证其分布是均匀的
如果范围不是32768的约数那么应该尽量不用rand()
如果是C++11以上有 <random>
备用的有 <boost/random>

参考
Channel9 @ MSDN
Stackoverflow


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明想问问这个生成随机数(1到4)的函数的原理