Zufallszahlen erzeugen



  • Hallo zusammen,
    ich weiß, wie ich generell eine Zufallszahl erzeuge:

    srand(4)
    int zahl=rand();
    

    Nun meine Fragen:

    1.) Was bewirkt der Parameter von srand? Wenn ich diesen wir hier konstant lasse, bekomme ich dann nur bestimmte Zufallszahlen?

    2.) Ich möchte gerne Zufallszahlen in einem bestimmten Intervall bekommen. Ich habe nun diese Zeile (aus einer Funktion, daher return):

    return (rand() % (ende+1 - start) + start);
    

    Damit habe ich ein Intervall, wobei ende und start vom Typ int sind. Doch verstehe ich die Syntaxs nicht. Kann mir da jemand helfen? Warum nutzt man hier den Modulooperator? Warum schreibe ich "ende+1-start" und dann wieder "+start"?

    Vielen Dank für eure Hilfe
    lg, freakC++



  • Nimm mal an, return rand() gibt eine zufällige Zahl zwischen 0 und 32767 aus. (Dein rand() kann größere Zahlen, ist aber egal.)
    Finde mal heraus, was dann die Sünthaxkqs return rand()%10 ausgibt.
    Danach ist Dir dann auch der ganze Rest klar.


  • Mod

    Was den Parameter von srand angeht:

    Die Zufallszahlen die rand zurückgibt, sind nicht wirklich zufällig, sondern werden aus dem vorherigen Wert berechnet nach einem bestimmten Schema, so dass die entstehende Zahlenfolge dann wie zufällig aussieht. Der Parameter von srand dient nun dazu, den Anfangswert für die Rechung in rand zu setzen. Also quasi den "vorherigen" Wert wenn du rand das erste Mal benutzt.



  • Der Seed-Wert kann, muss aber nicht dem "vorherigen" Wert entsprechen.



  • Hallo,

    @volkard: Sünthaxkqs 👍 😃

    Ja, mir wird der Rest der Divion durch 10 zurückgegeben. Na und! Irgendwie komme ich nicht hinter diese Zeile:

    return (rand() % (ende+1 - start) + start);

    Könnt Ihr mir bitte die Funktionsweise sagen? Das wäre nett...

    Vielen dank
    lg, freakC++


  • Mod

    hustbaer schrieb:

    Der Seed-Wert kann, muss aber nicht dem "vorherigen" Wert entsprechen.

    Es ist aber eine gute Lüge für Leute, die seeds nur oberflächlich verstehen wollen ohne die technischen Details.


  • Mod

    freakC++ schrieb:

    Hallo,

    @volkard: Sünthaxkqs 👍 😃

    Ja, mir wird der Rest der Divion durch 10 zurückgegeben. Na und! Irgendwie komme ich nicht hinter diese Zeile:

    return (rand() % (ende+1 - start) + start);

    Könnt Ihr mir bitte die Funktionsweise sagen? Das wäre nett...

    Vielen dank
    lg, freakC++

    Denk doch mal nach: Wenn du modulo 10 rechnest, welche Werte können dann als Ergebnis herauskommen?



  • Wie schon gesagt...es kommt der Rest raus, der bei einer Division durch 10 entsteht, also immer die letzte Ziffer der Zahl. Aber was bringt mir das bei dieser Zeile:

    return (rand() % (ende+1 - start) + start);

    Irgendwie stehe ich voll aufm Schlauch! Jetzt macht es nicht so spannend! :p

    lg, freakC++



  • Ja guck dir einfach die Teile an, guck dir an was die Teile bedeuten, dann ist sofort klar was es soll.

    (ende + 1 - start) ist z.b. was?



  • freakC++ schrieb:

    Wie schon gesagt...es kommt der Rest raus, der bei einer Division durch 10 entsteht, also immer die letzte Ziffer der Zahl. Aber was bringt mir das bei dieser Zeile:

    return (rand() % (ende+1 - start) + start);

    Irgendwie stehe ich voll aufm Schlauch! Jetzt macht es nicht so spannend! :p

    lg, freakC++

    Setz doch einfach Zahlen ein:

    rand() liefterte beispielsweise 160

    `start = 5

    ende = 100

    (160 % (100+1 - 5) + 5)

    = (160 % 96) + 5

    = 64 + 5

    = 69`

    Die Zufallszahl liegt also im Intervall [5, 100]

    Das ist alles...



  • mmh...und was soll die +1?

    lg, freakC++


  • Mod

    freakC++ schrieb:

    Wie schon gesagt...es kommt der Rest raus, der bei einer Division durch 10 entsteht, also immer die letzte Ziffer der Zahl.

    Denk nicht so sehr im Zehnersystem! Wenn du irgendeine Zahl modulo X rechnest, können als Ergebnis nur Werte zwischen 0 und X (inklusive 0 avber exklusive 😵 herauskommen. Das ist der ganze Trick hier.



  • SeppJ schrieb:

    freakC++ schrieb:

    Wie schon gesagt...es kommt der Rest raus, der bei einer Division durch 10 entsteht, also immer die letzte Ziffer der Zahl.

    Denk nicht so sehr im Zehnersystem! Wenn du irgendeine Zahl modulo X rechnest, können als Ergebnis nur Werte zwischen 0 und X (inklusive 0 avber exklusive 😵 herauskommen. Das ist der ganze Trick hier.

    Genau, und damit sollte die Formel dann klar sein. Nochmal mein Beispiel:
    (160 % (100+1 - 5) + 5)

    = (160 % 96) + 5
    Aus der generierten Zufallszahl wird mit Modulo eine Zahl zwischen 0 und 95 ermittelt.

    = 64 + 5

    Da der Intervall, aber zwischen 5 und 100 liegt wird noch 5 dazuaddiert.

    Du hast also nun definitiv eine Zahl zwischen 5 und 100.

    = 69

    In diesem Fall 69.



  • Achso...ja dann wird mir alles klar! Super 👍

    Vielen Dank für eure Hilfe
    lg, freakC++


Anmelden zum Antworten