生成[l u]范围内的随机数

时间:2012-10-09 19:54:17

标签: c random

  

可能重复:
  How to generate a random number from within a range - C

我在programming pearls

中看到了以下代码
int randint(int l, int u)
{   return l + (RAND_MAX*rand() + rand()) % (u-l+1);
}

任何人都可以帮我解释一下吗?

我们可以使用

吗?
return l + rand() % (u-l+1);

谢谢,

2 个答案:

答案 0 :(得分:3)

使用rand() % n得到介于0和n-1之间的数字的问题在于,当n不是RAND_MAX的精确除数时,它有一些偏差。 n值越高,这种偏差越强。

为了说明为什么会发生这种情况,让我们假设rand()将使用六面骰子来实现。所以RAND_MAX是5.我们想用这个die来生成0到3之间的随机数,所以我们这样做:

x = rand() % 4

对于rand的六个结果中的每个结果,x的值是多少?

0 % 4 = 0
1 % 4 = 1
2 % 4 = 2
3 % 4 = 3
4 % 4 = 0
5 % 4 = 1

如您所见,数字0和1的生成频率是数字2和3的两倍。

当您的用例不允许偏见时,这是计算随机数的更好方法:

 (int)((double)rand() / (double)RAND_MAX * (double)n)

答案 1 :(得分:1)

是的,没问题,请检查你> l你只能这样做:

return l + (RAND_MAX*rand()) % (u-l+1);

的解释:

如果我们希望在联合分布中生成[0,N]时我们使用的N>0中的随机整数:

 return (RAND_MAX*rand()) % (N+1);

因为在你的情况下,范围是一个恒定值l,我们只需要将它添加到最终结果中。

python模型:

>>> import random
>>> import sys
>>> for i in xrange(20):
    int(random.random()*sys.maxint%4)


0
1
2
3
1
1
2
2
3
0
3
3
0
2
3
3
1
2
2
3