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
,来获得更大范围的随机数的。
(前提是,这里说的都是整数哦。。。如果是实数范围的话另当别论啦。)
所以必须通过多次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