使用rand()时输出随机数范围

时间:2018-03-29 16:43:07

标签: c random

我的具体问题是当我输入一个像90这样的范围作为较低的值而100作为较高的值时,我得到的输出随机数有时小于90。{{ 1}} 我的代码是:

In my code below , x<y.

4 个答案:

答案 0 :(得分:2)

假设您想要一个独占的上限,正确的方法是:

low

假设高= 100且低= 90,请逐步了解其工作原理:

  • 你生成一个随机的int
  • (高 - 低)为您提供范围,100 - 90 = 10.
  • 当你除以10时,你将得到[0,10]范围内的结果,所以它将是0,1,2,3,4,5,6,7,8或者中的一个,或者9
  • 因为您真正想要的是90,91,92,...,99之一,您必须将(rand() % (high + 1 - low)) + low 添加回来

这里要注意的是你只会得到[90,99]。如果你想要包含上限所以[90,100],那么你想要为你要修改的金额加1:

{{1}}

答案 1 :(得分:1)

您必须将此公式用于y exclusive(a [x,y [):

中的a
a = (rand() % (y - x)) + x;

和y包含这个(a [x,y]中的a):

a = (rand() % (y - x + 1)) + x;

答案 2 :(得分:0)

修改 它应该是:

if (x == y) a = x
else a = (rand() % (y - x)) + x

答案 3 :(得分:-1)

假设您想要一个实际的随机分布...... psudeocode

range = high - low
r = rand()
while (r > range)
{
    r=rand();
}
r+=low;
这样的事情应该通过拒绝超出范围的事情来给你一个统一的分布,因为使用mod n对于兰德域的所有n值都没有统一的分布({{1在我的C库上0RAND_MAX

让我们使用假设的0xf示例作为域名:

如果您对范围中的每个值执行0x7fffffff ... 然后你得到: 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5。它有2 *多0,1,2,3,4,5和6,7,7,8,9 ...

通过访问更大的域,您可以获得更顺畅的分发,但如果您没有通过干净地划分RAND_MAX + 1

的东西进行修改,它将永远是块状的

取决于你正在使用的数字以及rand你有多快就可以像上面那样做一些简单的事情,或者你可以丢弃超过你的除数干净利落的最大数字的东西......所以如果你要分开就丢弃所有超过0x7FFFFFF8的东西以10来摆脱偏见。