3

可能重复:
如何从一个范围内生成一个随机数 - C

我从编程珍珠中看到了以下代码

int randint(int l, int u)
{   return l + (RAND_MAX*rand() + rand()) % (u-l+1);
}

谁能帮我解释一下?

我们可以使用

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

谢谢,

4

2 回答 2

3

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

为了说明为什么会发生这种情况,让我们假设 rand() 将使用六面骰子来实现。所以 RAND_MAX 将是 5。我们想用这个骰子生成 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)
于 2012-10-09T20:02:36.870 回答
1

是的,没关系,检查 u>l 你只能这样做:

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

解释:

如果我们想在联合分布中生成一个随机整数,[0,N]我们N>0将使用:

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

由于在您的情况下范围是一个恒定值l,因此我们只需将其添加到最终结果中即可。

蟒蛇模型:

>>> 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
于 2012-10-09T19:58:40.823 回答