我已经编写了一个源代码来打印指定限制内的随机数。但它也返回一些负数,这是正常的吗?如果不是,我该如何纠正它?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main( int argc, char* argv[])
{
int fd, n;
fd = open("/dev/urandom", O_RDONLY);
if(fd == -1)
printf("ERROR: Cannot Open %s\n",argv[1]);
read(fd, &n, sizeof(n)); //n=random number
printf("%d\n",1+n%6); //limiting n
/* 1+n%6 should give me random numbers only between
1-6(correct me if I'm wrong),
but somehow it even gives negative numbers*/
close(fd);
}
答案 0 :(得分:1)
如果您读取的随机数为负数(当然可以),则其模数也可以为负数。您应该使用无符号整数,以确保结果在您想要的范围内。
可以找到更多信息here。
答案 1 :(得分:1)
1 + n % 6
并未将结果神奇地约束在0-6
之间。运行此以查看。
#include <stdio.h>
int main(int argc, char* argv[]) {
printf("%d\n", 1 + (-23) % 6);
return 0;
}
答案 2 :(得分:1)
哇,即使我认为模数运算符应用时像
一样c=a%b
在整数[0,b-1]之间限制c。
然而,正如K&amp; R所写(第39页,第2版):
表达式x%y生成 当x除以y时的余数,和 当y精确地除x时,因此为零。
因此实际发生的是:
c = sign(a) * ( abs(a)%abs(b) )
(其中sign(a)= - 1表示&lt; 0而+1表示&gt; = 0)
如果有人能够在书或C标准中指出对这种行为的实际参考,那将是很好的。这是我在用GCC v4.4.1进行实验后想出的。
感谢这个好问题。你有点清楚我对C模数算子的理解。