Zufallszahl
-
hey @ all
ich hab schon hier im forum gesucht und gegoogelt hab aber nix richtiges gefunden.
ich möchte das mein progg (konsolenprogg),
mir eine zufallszahl von 1,2,3 ausgibt.geht das irgendwie?
mfg
-
1 + (int) (3.0 * (rand() / (RAND_MAX + 1.0)));
-> entnommen aus der man-page zu rand, wo dringend davon abgeraten wird das ganze über modulo zu machen.
-
oha das versteh ich gar net
1 + (int) (3.0 * (rand() / (RAND_MAX + 1.0)));muss ich nicht die zahlen 1,2,3 angeben?
damit er nur aus den zahlen eine zufallszahl ausgibt
-
genau das macht der code. rand erzeugt eine zufallszahl zwischen 0 und MAX_RAND das ganze wird durch MAX_RAND+1 geteilt (erzeugt also float-werte zwischen 0 und irgendwas knapp unter 1). das wird mit 3 multipliziert, ergibt float-werte zwischen 0 und irgendwas knapp unter 3. durch die umwandlung in int (=ignorieren des nachkommaanteils) erzeugst du zahlen zwischen 0 und 2. das +1 bewirkt, dass du zahlen zwischen 1 und 3 erzeugst.
nachtrag: um den code an andere bereich anzupassen musst du für die untere grenze die 1 ändern und für die obere grenze die 3.0 (<- float ist wichtig).
-
ah ok
jetzt versteht man das auch

un wie soll ich das ausgeben?
cout<<rand();
???
-
wenn dann:
cout << 1 + (int) (3.0 * (rand() / (RAND_MAX + 1.0)));oder eben in eine sinnvolle funktion packen. bspw:
int random(int unten, int oben) { return unten + (int) (float(oben) * (rand() / (RAND_MAX + 1.0))) }und dann:
cout << random(1,3) << endl;achja: ganz wichtig. vor dem ersten aufruf einmal srand ausführen.
-
ah ok vielen dank
mfg
-
ach mist. fällt mir gerade auf: die funktion war natürlich falsch...
so ist es richtig:int random(int unten, int oben) { return unten + (int) (float(oben+1-unten) * (rand() / (RAND_MAX + 1.0))) }das float(oben+1-unten) legt schließlich die breite des bereiches und nicht die obere grenze fest. sorry.
-
ok danke aber bei der funktion
cout << 1 + (int) (3.0 * (rand() / (RAND_MAX + 1.0)));gibt er mir immer 1 aus
mfg
-
???
das ist sehr seltsam. hast du srand vor und nur vor dem ersten aufruf ausgeführt? hast du eine schleife etwa in der form:for (int i=0;i<40;++i) std::cout << 1 + (int) (3.0 * (rand() / (RAND_MAX + 1.0))) << std::endl;eingebaut um es zu test?
wenn du auf srand verzichtest, liefert dein programm immer die gleiche folge an zufallszahlen und das kann zusammen mit dem auswurf von nur einer zufallszahl dazu führen, dass du immer das gleiche ergebniss bekommst.
-