Frage zur rand() Funktion in C



  • Hallo zusammen,

    ich habe eine kurze Frage zur rand() Funktion.
    Mir ist bekannt, dass man beispielsweise um Zahlen zwischen 1-6 heraus zu bekommen den Modulo Operator verwendet. rand() % 6 + 1;

    Wenn ich jetzt eine Zahl zwischen A und B haben möchte, sieht das so aus:

    int a = 7;
    	int b = 12;
    
    	srand(time(NULL));
    
    	int zuf = rand() % (b - a + 1) + a;
    	printf("%d", zuf);
    

    Jetzt stellt sich mir die Frage, warum genau ist das so ?
    Es wäre schön, wenn sich Jemand findet, der das erklären kann.
    Vielen Dank für eure Antworten.



  • Weil simple Mathematik.

    Fangen wir ganz am Ende an, + a. Das Modulo + 1 wird dir immer einen Wert von 1 bis x zurückgeben. Um an den Anfang des Bereiches, den du haben willst, zu kommen, musst du am Ende noch + a rechnen. Damit hast du schon mal die untere Grenze deines Bereiches bekommen.

    Jetzt die obere Grenzen: auf das Ergebnis der Berechnung machen wir in jedem Fall ein + a. Das kann, wenn wir b nicht darauf anpassen, dazu führen, dass wir mit dem + a Werte jenseits von b bekommen. Das wollen wir nicht, deswegen verringern wir b temporär, machen dann die Modulorechnung, und verschieben wieder beide Grenzen.

    Es handelt sich dabei praktisch um eine dir bereits bekannte Berechnung mit nachträglicher Grenzenverschiebung. Wenn du also 4 - 9 haben willst, rechnest du auf 1 - 6 runter, machst die Rechnung, und gehst dann wieder auf 4 - 9 hoch.


Anmelden zum Antworten