我的具体问题是当我输入一个像90这样的范围作为较低的值而100作为较高的值时,我得到的输出随机数有时小于90。{{ 1}} 我的代码是:
In my code below , x<y.
答案 0 :(得分:2)
假设您想要一个独占的上限,正确的方法是:
low
假设高= 100且低= 90,请逐步了解其工作原理:
(rand() % (high + 1 - low)) + low
添加回来这里要注意的是你只会得到[90,99]。如果你想要包含上限所以[90,100],那么你想要为你要修改的金额加1:
{{1}}
答案 1 :(得分:1)
您必须将此公式用于y exclusive(a [x,y [):
中的aa = (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库上0
到RAND_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来摆脱偏见。