C 准确地找到生成的数字范围?

C 准确地找到生成的数字范围?,c,range,C,Range,我很可能整个代码都错了,但在尝试查找以下范围时: 4.0*rand()/rand_MAX+1 结果我只得到了数字0,我很确定还有更多 代码(C): #包括 #包括 #包括 int main() { srand(时间(空)); INTR; 4.0*rand()/rand_MAX+1; printf(“%i”,r); 返回0; } 双rr=4.0*rand()/rand_MAX+1您需要使用double,更重要的是将结果(rr)分配给某个变量 printf(“%lf”,rr)用于打印结果 就目前来看

我很可能整个代码都错了,但在尝试查找以下范围时:

4.0*rand()/rand_MAX+1

结果我只得到了数字0,我很确定还有更多

代码(C):

#包括
#包括
#包括
int main()
{
srand(时间(空));
INTR;
4.0*rand()/rand_MAX+1;
printf(“%i”,r);
返回0;
}

双rr=4.0*rand()/rand_MAX+1
您需要使用double,更重要的是将结果(
rr
)分配给某个变量

printf(“%lf”,rr)用于打印结果

就目前来看,这里没有射程计算

您只是在打印一个未初始化的变量(
r
)。(打印时,它似乎包含值
0

两件事:

首先,您从未分配
r
任何值。您需要更改
4.0*rand()/rand\u MAX+1
r=4.0*rand()/rand_MAX+1

其次,编译器可能会对此抱怨,因为您正在从double降级为int。您应该将
4.0
更改为
4


最后的代码应该大致类似于
r=4*rand()/rand_MAX+1。然后,范围将为{1,2,3,4,5}(注意:取决于
rand
是否可以返回
rand_MAX
或仅小于
rand_MAX
。如果仅小于,则排除5。)如果需要{0,1,2,3},则需要将
rand_MAX+1
括在括号中

注:正如评论中所指出的,上述内容可能存在一些问题。您可以使用类似的方法获得完全相同的分布:

r = rand()
if (r == RAND_MAX) return 5;
else return r % 4 + 1;
如果您不想返回5,可以使用拒绝采样:

r = RAND_MAX;
while (r == RAND_MAX) r = rand();
return r % 4 + 1;

找到一个范围?一个号码的号码?嗯?
r
没有分配任何值。变量
r
包含垃圾。
rand()/rand\u MAX
会导致分布不均匀。从数学上讲,代码需要执行
rand()/(rand\u MAX+1)
。建议
4.0*rand()/(rand_MAX+1.0)+1更好的代码将处理
RAND_MAX
double
更精确地像
4.0*RAND()/(RAND_MAX+1LLU)+1但是
rand()/rand_MAX
不是
0
?这是一个完整的数学。@coderedoc Yes(如果
rand
不能返回
rand_MAX
,我不记得了,但我会同意),但是
4*rand()/rand_MAX
可以返回非零数字,因为
4*rand()
应该首先求值。
4*rand()
如果rand MAX为INT,则可能溢出_MAX@Bob__公平点;RAND_MAX的值取决于实现。这需要检查。在我的环境中,它看起来是32767(最小保证值),所以它会很好。
rand()
可以返回
rand\u MAX
。除了
4
之后的
.0
之外的所有内容都表明它的目的是整数数学。不用说,与使用整数相比,使用double将给出非常不同的分布;更不用说在使用double时尝试实际计算实际分布的困难了,你明智地不要尝试。@Patrick87:请不要介意,但你能澄清一下吗?这里的分布将是不同的,范围是无限的,但是如果我们这样想,无论现在是多少,我们都会考虑到双的整数部分,那么是的,这是可行的。如果我错了,请纠正我?没问题-该分布将是一个离散分布,具有
RAND_MAX+1
可能的结果。由于截断,间距会有点不均匀,但如果RAND_MAX是32位整数,我们讨论的是双精度,则重复和降级间距应该不会有问题。在相同的假设下,使用这个公式,然后保留整数部分,将产生与纯整数代码完全相同的分布。@Patrick87.:我不知道OP为什么问这样的问题。我是说也许是OP自己的实验。否则我不知道。我只是集中在这一部分,是的,有一个赋值问题,如果是这样做的话,就不会因为int算法而被截断。谢谢你过来解释。
r = RAND_MAX;
while (r == RAND_MAX) r = rand();
return r % 4 + 1;