unter- und obergrenze bei rand()-funktion



  • Hallot Leute.
    Ich hab folgendes Problem:
    Ich will mithilfe der rand()-funktion eine zufällige Zahl ausgeben lassen. Dabei soll der Benutzer, jedoch selbstständig die untere Grenze und die obere Grenze festlegen können.
    Bei einem Würfel mache ich es ja so:

    printf("Augenzahl: %d ", 1+rand()%6);
    

    Mein Würfel funktioniert so auch fehlerfrei.
    Setze ich es jetzt jedoch bei meinem Vorhaben um, so kommen teilweise zufällige Zahlen ausserhalb des eingegrenzten bereiches raus.
    So sieht mein Code aus:

    printf("Untere Grenze: ");
    scanf("%d", &untere_grenze);
    printf("\n > Obere Grenze: ");
    scanf("%d", &obere_grenze);
    printf("\n > Zufallszahl: %d", untere_grenze+rand()%obere_grenze);
    

    Ich steh auf dem Schlauch. Habe ich was übersehen?



  • Die Anzahl der guten Zahlen ist nicht obergrenze!
    untere_grenze+rand()%anzahl



  • aachsooo jetzt verstehe ich... also subtrahiere ich im code noch die untere grenze von der oberen grenze!

    printf("\n > Zufallszahl: %d", untere_grenze+rand()%(obere_grenze-untere_grenze));
    

    So scheint es nun zu funktionieren! Ich danke herzlichst 🙂



  • Binganzokay schrieb:

    So scheint es nun zu funktionieren! Ich danke herzlichst 🙂

    Teste mal genau. Sagen wir mal einen Würfel mit 1,2,3,4,5,6 und schau, ob alle Zahlen ungefähr gleich oft vorkommen.



  • Bei einem Würfel kannst du das auch durch überlegen hinbekommen:

    untere_grenze = 1;
    obere_grenze  = 6;
    
    dann wird aus
    untere_grenze+rand()%(obere_grenze-untere_grenze))
    folgendes
    1 + rand()%(6-1) 
    daraus
    1 + rand()%(5)
    

    Das %5 ergibt Zahlen zwischen 0 und 4. Mit dem + 1 davor gibt es dann 1 bis 5

    Komischer Würfel



  • Ja mir ist es schon nach meinem Post aufgefallen. Ich habe vor der Funktion noch ein inkrement für die obere grenze hinzugefügt.. ich hielt es nicht mehr für nötig es hier zu posten


  • Mod

    Eine langfristig bessere Lösung ist, sich anzugewöhnen, Bereiche als [Untergrenze, Obergrenze) anzugeben (also die Untergrenze gehört zur Menge dazu, die Obergrenze nicht). Dann kann man einheitlich Schleifen als

    for (Wert = Untergrenze; Wert != Obergrenze; verändere(Wert))
    

    schreiben. Man kann zudem leicht und intuitiv die Menge der Elemente berechnen als (Obergrenze - Untergrenze). Man kann damit leere Mengen beschreiben (Wenn Obergrenze == Untergrenze), versuch das mal mit deiner Schreibweise. Und sicherlich noch ein paar mehr Vorteile, die ich vergessen habe.



  • SeppJ schrieb:

    Und sicherlich noch ein paar mehr Vorteile, die ich vergessen habe.

    Microsoft macht es auch so. 🤡
    http://msdn.microsoft.com/de-de/library/vstudio/2dx6wyd4.aspx


  • Mod

    volkard schrieb:

    SeppJ schrieb:

    Und sicherlich noch ein paar mehr Vorteile, die ich vergessen habe.

    Microsoft macht es auch so. 🤡
    http://msdn.microsoft.com/de-de/library/vstudio/2dx6wyd4.aspx

    Und auch alle Bibliotheken (zumindest die professionellen) für alle Zwecke, die ich jemals irgendwo gesehen habe. Eben aus diesen Gründen.



  • Ah, verstehe. Da hab ich mich wohl ein wenig vertan 😕
    Ich werde es nachher mal umschreiben.
    Dankeschön 🙂


Anmelden zum Antworten