Pages

Monday, February 28, 2011

随机数讨论

rand5()是没有能力只通过一次随机数的产生,和一些四则运算
,来获得更大范围的随机数的。
(前提是,这里说的都是整数哦。。。如果是实数范围的话另当别论啦。)
所以必须通过多次rand5()才行呢


Expand a random range from 1-5 to 1-7

int i;
do
{
  i = 5 * (rand5() - 1) + rand5();  // i is now uniformly random between 1
and 25
} while(i > 21);
// i is now uniformly random between 1 and 21
return i % 7 + 1;  // result is now uniformly random between 1 and 7



WHy can't I just put

i = 6*(rand5()-1);

* 1没有保证平均概率
* 2返回的数值的范围也不对呀


5*(rand5()-1):产生0,5,10,15或者20
5 * (rand5() - 1) + rand5()就是1-25之间的随机数
如果我没有记错的话,后面那个while应该是:
if(i<21) return i%7

while(i > 21);
// i is now uniformly random between 1 and 21
return i % 7 + 1;
产生的是2-5,就不对了

至于楼主的做法,
i = 6*(rand5()-1),产生的是0,6,12,18或者24

No comments:

Post a Comment