DarkChip
Anmeldungsdatum: 18. Oktober 2012
Beiträge: 67
|
Hallo, wollte mir eine EINFACHE Lottosimulation bauen.
Funktionieren tut sie ja, aber sie füllt das Array immer nur mit einer Zufallszahl, anstatt mit 6 unterschiedlichen Zufallszahlen
Hier mal der Quellcode: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 | #include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
int Lottofeld[6];
int getippteZahlen[6];
cout << "Lotto!" << endl;
for (int i=0; i<6; i++)
{
srand (time(NULL));
Lottofeld[i] = rand() % 49; //Und hier müsste er doch das array Lottofeld mit unterschiedlichen
Zahlen bis 49 fuellen, oder sehe ich das falsch ?
}
for (int i=0; i<6; i++)
{
cout <<Lottofeld[i]<<"Test"<<endl; //ledigliches testfeld
}
cout << "Bitte geben Sie Ihre gewünschten Lottozahlen ein!"<<endl;
for (int i=0; i<6; i++) //Fragt nach Lottozahlen
{
int zaehler = 0;
cout << zaehler+1 << ". Zahl: ";
cin >> getippteZahlen[i];
}
int i=0; //lediglich zum vergleichen von beiden Arrays benötigt;
if (Lottofeld[i] == getippteZahlen[i])
cout << "Herzlichen Glückwunsch, Sie haben gewonnen!"<<endl;
else
cout << "Leider haben Sie verloren. Viel Erfolg beim nächsten Mal!"<<endl;
return 0;
}
|
Gruß
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Der Fehler dürfte sein, dass du die Initialisierung des Zufallsgenerators in jedem Durchlauf deiner Schleife durchführst. Setze die Zeile mit srand() also mal *vor* die Schleife. Dann müsste es funktionieren.
|
stfischr
Anmeldungsdatum: 1. März 2007
Beiträge: 19197
|
Also theoretisch wäre es kein Problem, den Seed jedes Mal neu zu initialisieren (obwohl man das nicht macht). Allerdings sollte man dann nicht immer den gleichen Wert nehmen 😬 . time ist nämlich nur Sekundengenau und die For-Schleife ist geschätzt in 1ns abgearbeitet. Fies wird es, wenn man so einem Problem mit dem Debugger schritt für schritt nachgehen will, dann funktioniert es plötzlich perfekt 😀
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Ich hab's mal aus Spass an der Freude etwas mehr im C++ Stil probiert, wobei ich die Sprache nicht wirklich beherrsche... ^^ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | #include <iostream>
#include <stdlib.h>
#include <sys/time.h>
#include <vector>
using namespace std;
int main() {
vector<int> numbers(6);
timeval time;
gettimeofday(&time, 0);
srand(time.tv_usec);
for (int i = 0; i < numbers.size(); i++)
numbers.at(i) = (rand() % 49) + 1;
for (int i = 0; i < numbers.size(); i++)
cout << numbers.at(i) << endl;
return EXIT_SUCCESS;
}
|
Ich initalisiere den Zufallsgenerator hier mit Mikrosekunden statt mit Sekunden, um bei kurz aufeinander folgenden Programmaufrufen trotzdem unterschiedliche Ergebisse zu erhalten (auch wenn das etwas kleinlich sein mag). Zudem steckte im vom OP codierten rand() % 49 der Fehler, dass 0 rauskommen konnte und dass niemals 49 rauskam. Dies habe ich ebenfalls korrigiert... ☺ Inwiefern man das noch C++-typischer programmieren könnte, weiß ich aber nicht. Ich find's halt nur immer blöd, wenn C++-Programmierung lediglich daraus besteht, dass man cout benutzt. 😉
|
DarkChip
(Themenstarter)
Anmeldungsdatum: 18. Oktober 2012
Beiträge: 67
|
klasse, hab den seed ausserhalb der Schleife gesetzt und es funktioniert. Danke ☺
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Hattest du den Hinweis bezüglich der Zahlenerzeugung verstanden/umgesetzt (dass es bei dir 0, sowie niemals 49 werden kann)? Außerdem ist mir beim Testen aufgefallen, dass ab und zu doppelte Zahlen rauskommen können. Da sollte man also idealerweise testen, ob eine Zufallszahl schonmal kam, bevor man sie hinzufügt.
|
DarkChip
(Themenstarter)
Anmeldungsdatum: 18. Oktober 2012
Beiträge: 67
|
ja, ich habe rand etwas erweiert rand() % 49+1 (genauen syntax hab ich jetzt nicht im Kopf) (0 sollte eh nicht rauskommen, da das bei Lotto auch nicht so ist) Das mit den doppelten Zahlen gucke ich mir noch an ☺ -das Problem löse ich dann in version 1.1 von meinen
Programm 😉
|
stfischr
Anmeldungsdatum: 1. März 2007
Beiträge: 19197
|
snafu1 schrieb: dass ab und zu doppelte Zahlen rauskommen können.
Das nennt sich Zufall und ist doch auch so gewollt oder? Wenn ich 2 Mal hintereinander ne 6 Würfel ist doch auch alles in Ordnung.
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
DarkChip schrieb: (0 sollte eh nicht rauskommen, da das bei Lotto auch nicht so ist)
Genau das meinte ich. Und 0 kommt halt immer dann raus, wenn das Ergebnis von rand() glatt durch 49 teilbar ist (zumindest wenn man nur Modulo nutzt). Aber das hast du ja anscheinend inzwischen geändert. stfischr schrieb: snafu1 schrieb: dass ab und zu doppelte Zahlen rauskommen können.
Das nennt sich Zufall und ist doch auch so gewollt oder? Wenn ich 2 Mal hintereinander ne 6 Würfel ist doch auch alles in Ordnung.
Ja, beim Würfeln vielleicht, aber bei Lottozahlen ist es doch eher ungewöhnlich.
|
stfischr
Anmeldungsdatum: 1. März 2007
Beiträge: 19197
|
Hehe, hab wohl keine Ahnung von Lotto.
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Hier mal eine Variante, die doppelte Zahlen unmöglich macht, da ein Set anstatt eines Vektors benutzt wird:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 | #include <iostream>
#include <stdlib.h>
#include <set>
#include <sys/time.h>
using namespace std;
int main() {
set<int> numbers;
set<int>::iterator it;
timeval time;
gettimeofday(&time, 0);
srand(time.tv_usec);
while (numbers.size() < 6) {
int number = (rand() % 49) + 1;
numbers.insert(number);
}
for (it = numbers.begin(); it != numbers.end(); ++it)
cout << *it << endl;
return EXIT_SUCCESS;
}
|
|
stfischr
Anmeldungsdatum: 1. März 2007
Beiträge: 19197
|
Lass mal dem TE noch ein bisschen Arbeit übrig, der will glaube die Sprache lernen ^^
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
stfischr schrieb: Lass mal dem TE noch ein bisschen Arbeit übrig, der will glaube die Sprache lernen ^^
Ich anscheinend auch... 😬
|
DarkChip
(Themenstarter)
Anmeldungsdatum: 18. Oktober 2012
Beiträge: 67
|
super nett von dir Snafu1 dass du dir extra die Mühe machst, ein Programm zu schreiben. Muss aber aber stfischr recht geben - bin noch relativ neu in C++ ☺ und will es selber erlernen..
|