打印随机数会返回负数。 (的/ dev / urandom的)

时间:2010-09-06 05:25:06

标签: c linux ubuntu random

我已经编写了一个源代码来打印指定限制内​​的随机数。但它也返回一些负数,这是正常的吗?如果不是,我该如何纠正它?

#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);

}

3 个答案:

答案 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模数算子的理解。