我有以下函数生成介于-10和2之间的随机数:
#include <stdlib.h>
#include <time.h>
static int
getRandomReturnCode(void)
{
int N = 2,
M = -10;
srand(time(NULL));
r = M + rand() / (RAND_MAX / (N - M + 1) + 1);
if (r == 0){
getRandomReturnCode();
}
return r;
}
目前,如果返回0(成功)的返回代码,它将递归调用该函数,直到满足并返回非零返回代码。我可以做些什么来改进我的代码,使0被排除在随机选择的数字范围之外?
答案 0 :(得分:8)
无论你做什么,如果返回的值为0,不重绘:这将在结果中引入统计偏差。
这里最好的做法是在-10和1之间绘制,并在任何非负输出上加1。
最后,拨打srand
一次,否则会破坏生成器的统计属性。
(简单地说 - 因为这个评论更多地用于数学网站 - 并且将参数限制为线性同余生成器,如果省略生成的值,往往会发生的事情是增加所得分布的方差,使其不再均匀先前绘制的小数字将与后续绘图线性相关,因为生成器的模数将不起作用。如果丢弃图纸并且那么相邻图纸的自相关 - 这对于所得到的分布是均匀的 - 将是缩减的。 会增加样本差异。)