Würfel mit srand und rand
-
Hallo
Ich bin im Rahmen unserer Übungen auf eine Aufgabe gestoßen, bei der ich leider nicht weiter komme. Ich habe echt absolut keine Ahnung wie ich das machen soll.Kann mir hier jemand helfen?
Aufgabe:
Schreiben Sie ein Programm, das mittels srand() und rand() einen W¨urfel (mit den
m¨oglichen Augenzahlen 1-6) simuliert. Der Benutzer bestimmt die Anzahl der W¨urfe,
das Programm gibt die prozentuale Verteilung des Resultats zur¨uck.Danke schon mal im voraus.
gruß
-
Woran hakt es denn genau? Oder sollen wir dir nur die Hausaufgabe machen?
-
physikus schrieb:
Ich habe echt absolut keine Ahnung wie ich das machen soll.
am besten du informierst dich, welche werte ein nacktes rand() raushaut und dann überlegst du dir, wie du das auf 1...6 umrechnen kannst.
-
Das was mal als operator benutzen muss ist so ähnlich wie die prozentuale verteilung
-
int zufallszahl, i; srand(time(NULL)); printf("Zufallszahl lautet %d\n", zufallszahl=rand()%6+1); return 0;
so, hab jetzt wohl mal den zufallsgenerator.
Probleme:1. Ich weiß nicht warum das mit dem Modulo Operator so funktioniert wie es funktioniert? (zufallszahl=rand()%6+1); )?? Meiner Meinung nach teilt er die Zufallszahl doch jetzt durch 6 und gibt den Rest zurück???
2. wie mach ich das mit der Verteilung? Muss ich da alle Werte zählen und dann die Verteilung berechnen, oder gibt es da einen extra Befehl?
-
physikus schrieb:
2. wie mach ich das mit der Verteilung? Muss ich da alle Werte zählen und dann die Verteilung berechnen, oder gibt es da einen extra Befehl?
fertige befehle gibt's glaub' ich nicht dafür, aber versuch' mal bei google: 'gaussian distribution filetype:c'
-
Hallo zusammen,
In Numerical Recipes in C: The Art of Scientific Computing (William H.
Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New
York: Cambridge University Press, 1992 (2nd ed., p. 277)), the following
comments are made:
"If you want to generate a random integer between 1 and 10, you
should always do it by using high-order bits, as inj = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
and never by anything resembling
j = 1 + (rand() % 10);
(which uses lower-order bits)."
Und hier ein kleines Beispiel (hoffe es funktioniert, da ungetestet)...
#include <iostream> #include <cstdlib> using namespace std; int main() { srand(time(0)); for (int i=0; i<10; ++i) { int x = 1 + (int)(6.0 * (rand() / (RAND_MAX+1.0))); cout << x << endl; } }
Grüße Martin
Anmerkung: Ich bin ja hier im Bereich C gelandet...
Das Beispiel ist in C++. Die relevante Zeile lässt sich aber problemlos übernehmen.
-
physikus schrieb:
1. Ich weiß nicht warum das mit dem Modulo Operator so funktioniert wie es funktioniert? (zufallszahl=rand()%6+1); )?? Meiner Meinung nach teilt er die Zufallszahl doch jetzt durch 6 und gibt den Rest zurück???
Gut erkannt
Und der Rest bei dieser Division liegt in welchem Bereich?
2. wie mach ich das mit der Verteilung? Muss ich da alle Werte zählen und dann die Verteilung berechnen, oder gibt es da einen extra Befehl?
Du nimmst dir ein Array und zählst dort drin, wie oft jeder mögliche Wert aufgetreten ist:
int werte[6]={0}; for(i=0;i<x;++i) ++werte[rand()%6]; for(i=0;i<6;++i) printf("%d wurde %d-mal geworfen\n",i+1,werte[i]);
@tux: Das macht auch nichts - wenn du die cout-Zeile durch 'printf("%d\n",x);' ersetze, hast du schon die C-Version davon
-
So, hab das Programm jetzt fertig.
Aber warum das mit dem Modulo funktioniert, weiß ich immer noch nicht.zb Zufallszahl ist 100
dann: 100%6= 16.6666 also müsste dann doch als "rest" 0.6666 raus kommen, und nicht eine Zahl zwischen 1 und 6???
using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int zufallszahl, i, j=144445; int feld[6]={0}; srand(time(NULL)); for (i=0;i<j;i++) { zufallszahl=rand()%6+1; if (zufallszahl == 1) feld[0]++; if (zufallszahl == 2) feld[1]++; if (zufallszahl == 3) feld[2]++; if (zufallszahl == 4) feld[3]++; if (zufallszahl == 5) feld[4]++; if (zufallszahl == 6) feld[5]++; } cout << "Bei " <<j<< " Wuerfen ergibt sich folgende Verteilung" <<endl<<endl <<"1: " <<(feld[0]*100)/j <<"."<< feld[0]%j <<" %"<< endl <<"2: " <<(feld[1]*100)/j <<"."<< feld[1]%j <<" %"<< endl <<"3: " <<(feld[2]*100)/j <<"."<< feld[2]%j <<" %"<< endl <<"4: " <<(feld[3]*100)/j <<"."<< feld[3]%j <<" %"<< endl <<"5: " <<(feld[4]*100)/j <<"."<< feld[4]%j <<" %"<< endl <<"6: " <<(feld[5]*100)/j <<"."<< feld[5]%j <<" %"<< endl<<endl; return 0;
-
physikus schrieb:
if (zufallszahl == 1) feld[0]++;
if (zufallszahl == 2) feld[1]++;
if (zufallszahl == 3) feld[2]++;
if (zufallszahl == 4) feld[3]++;
if (zufallszahl == 5) feld[4]++;
if (zufallszahl == 6) feld[5]++;-->
feld[zufallszahl-1]++;
-
pale dog schrieb:
physikus schrieb:
if (zufallszahl == 1) feld[0]++;
if (zufallszahl == 2) feld[1]++;
if (zufallszahl == 3) feld[2]++;
if (zufallszahl == 4) feld[3]++;
if (zufallszahl == 5) feld[4]++;
if (zufallszahl == 6) feld[5]++;-->
feld[zufallszahl-1]++;
Das hatte ich noch gesucht. DANKE
-
physikus schrieb:
dann: 100%6= 16.6666 also müsste dann doch als "rest" 0.6666 raus kommen, und nicht eine Zahl zwischen 1 und 6???
Falsch. Modulo(%) ist ein Ganzzahl-Operator. Er nimmt zwei ints und gibt einen zurück. Richtig ist:
100 % 6 = 100 - 100 / 6 = 4;
Der Rest ist immer das was man nicht mehr teilen kann (4 / 6)Probier mal den folgenden Code aus uns sieh dir die Ergebnisse an:
for (int i = 0; i < 100; ++i) printf("%i\n", i % 6);
(Hoffe ist so richtig, bin C++ler)
Erkennst du ein gewisses Muster?
Gruß
Don06
-
Und das mit dem modulo kann keiner erklären?
-
-
alles klar..... stimmt.....
jetz hab ichs verstandenDanke