3 Stimmen

Das Drucken einer Zufallszahl ergibt eine negative Zahl. (/dev/urandom)

Ich habe einen Quellcode geschrieben, um Zufallszahlen innerhalb einer bestimmten Grenze zu drucken, aber es werden auch einige negative Zahlen zurückgegeben, ist das normal, wenn nicht, wie kann ich es korrigieren?

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

}

1voto

abyx Punkte 65176

Falls die abgelesene Zufallszahl negativ ist (was durchaus möglich ist), kann auch ihr Modulus negativ sein. Sie sollten eine ganze Zahl ohne Vorzeichen verwenden, um sicherzustellen, dass das Ergebnis in dem von Ihnen gewünschten Bereich liegt.

Weitere Informationen finden Sie unter ici .

1voto

Hitesh Punkte 1412

1 + n % 6 beschränkt das Ergebnis nicht auf magische Weise auf einen Wert zwischen 0-6 . Führen Sie dies aus, um zu sehen.

#include <stdio.h>

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

  return 0;
}

1voto

BiGYaN Punkte 6796

Wow, sogar ich dachte, dass der Modulo-Operator, wenn er wie

c=a%b

schränkt c zwischen den ganzen Zahlen [0,b-1] ein.

Doch wie K&R schreibt (S. 39, 2. Auflage):

Der Ausdruck x % y ergibt die Rest, wenn x durch y geteilt wird, und ist also Null, wenn y genau durch x geteilt wird.

Das heißt, es passiert Folgendes:

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

(wobei sign(a)=-1 für a<0 und +1 für a>=0)

Es wäre toll, wenn jemand einen konkreten Hinweis auf dieses Verhalten in einem Buch oder C-Standard geben könnte. Dies ist, was ich nach Experimenten mit GCC v4.4.1 herausgefunden habe.

Danke für die tolle Frage. Sie haben mein Verständnis des C-Modul-Operators etwas geklärt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X