随机数范围,不包括0

ILo*_*oon 4 c

我有以下函数生成-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;
}
Run Code Online (Sandbox Code Playgroud)

目前,如果返回0(成功)的返回代码,它将递归调用该函数,直到满足并返回非零返回代码.我可以做些什么来改进我的代码,使得0被排除在随机选择的数字范围之外?

Bat*_*eba 8

无论你做什么,如果返回值为0 ,不要重绘:这会在结果中引入统计偏差.

这里最好的做法是在-10和1之间绘制,并在任何非负输出中加1.

最后,srand 一旦调用,你将破坏生成器的统计属性.

(简而言之 - 因为这个评论更多的是针对数学网站 - 并且将参数限制为线性同余生成器,如果省略生成的值,往往会发生这种情况,即增加所得分布的方差,使其不再均匀.绘制的小数字将与后续绘图线性相关,因为生成器的模数将不起作用.如果丢弃绘图并增加样本方差,则相关绘图的所得分布均匀所必需的自相关将被缩减.)