Печать случайного числа возвращает отрицательное число.(/ DEV / urandom) - PullRequest
3 голосов
/ 06 сентября 2010

Я написал исходный код для печати случайных чисел в пределах указанного предела. Но он также возвращает некоторые отрицательные числа, это нормально? Если нет, то как мне исправить это?

#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 ]

1 голос
/ 06 сентября 2010

1 + n % 6 магическим образом не ограничивает результат значением 0-6. Запустите это, чтобы увидеть.

#include <stdio.h>

int main(int argc, char* argv[]) {
  printf("%d\n", 1 + (-23) % 6);

  return 0;
}
1 голос
/ 06 сентября 2010

Ух ты, даже я думал, что оператор по модулю применительно к

c=a%b

ограничивает c между целыми числами [0, b-1].

Однако, как пишет K & R (стр. 39, 2-е изд):

Выражение x% y производит остаток, когда х делится на у, и таким образом, ноль, когда у делит х точно.

По сути, получается следующее:

c = sign(a) * ( abs(a)%abs(b) )

(где знак (a) = -1 для a <0 и +1 для a> = 0)

Было бы замечательно, если бы кто-то мог указать фактическую ссылку на это поведение в книге или стандарте Си. Это то, что я понял после экспериментов с GCC v4.4.1.

Спасибо за отличный вопрос. Вы как бы прояснили мое понимание оператора модуля C.

1 голос
/ 06 сентября 2010

Если случайное число, которое вы прочитали, является отрицательным (что, безусловно, возможно), его модуль также может быть отрицательным. Вы должны использовать целое число без знака, чтобы убедиться, что результат находится в нужном диапазоне.

Более подробную информацию можно найти здесь .

...