前三句等价为:
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> |