我有以下函数生成-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被排除在随机选择的数字范围之外?
无论你做什么,如果返回值为0 ,不要重绘:这会在结果中引入统计偏差.
这里最好的做法是在-10和1之间绘制,并在任何非负输出中加1.
最后,srand 一旦调用,你将破坏生成器的统计属性.
(简而言之 - 因为这个评论更多的是针对数学网站 - 并且将参数限制为线性同余生成器,如果省略生成的值,往往会发生这种情况,即增加所得分布的方差,使其不再均匀.绘制的小数字将与后续绘图线性相关,因为生成器的模数将不起作用.如果丢弃绘图并增加样本方差,则相关绘图的所得分布均匀所必需的自相关将被缩减.)