Zahlen per zufall abarbeiten
-
Hallo
Also Vectorgröße angeben?
Den User eine Zahl eingeben lassen und diese dann an deine Schleife zum Erzeugen der vector-Werte übergeben.
Wert des Vectors ausgeben?
EIn vector hat keinen Wert. Wenn du die einzelnen Elemente meinst, dann kannst du die alle in einer schleife nacheinander irgendwo ausgeben.
bis bald
akari
-
Das funktioniert einfach nicht.
Sobald ich die Funktion verlasse sind die Werte in dem Vector nicht mehr vorhanden. Also beim ersten mal schon noch aber sobald ich die Werte weiter nutzen möchte, sind sie nicht mehr da.
Das muß man doch irgendwie weiter speichern können!Wie soll das gehen, vielleicht mit Beispiel?
-
Hallo
du erzeugst die Zufallszahlen in einem lokalen vector in der Funktion zufall(). Damit verfallen alle Werte sobald die Funktiopn beendet wird.
Du kannst ganz einfach statt dem lokalen einen Member-vector nehmen#include "StdAfx.h" #include ".\random.h" void Random::zufall(int count) { Numbers.clear(); for(int k=0; k<count;k++){ Numbers.push_back(k); } start = Numbers.begin(); end = Numbers.end(); srand( (unsigned)time( NULL ) ); random_shuffle(start, end) ; it=start; }#pragma once #include <iostream> #include <algorithm> #include <functional> #include <vector> using namespace std ; class Random { public: void zufall(); typedef vector <int> IntVector; IntVector Numbers; };so hast du nach der Funktion zufall immer wieder Zugriff auf die erzeugten Zahlen, und auch noch eine variable Anzahl
void CRandom_TestDlg::OnBnClickedButton1() { Random test; int Count = ...; // Hier Anzahl der zu erzeugenden Zahlen test.zufall(Count); test.Numbers ... // Hier Ergebnisse abrufen CString in; in.Format(_T("%d"),*test.it); m_strAusgabe = in; UpdateData (FALSE); }bis bald
akari
-
Danke für die Antwort.
Werde ich gleich mal probieren!!
-
Funktioniert leider auch nicht!
Ich muß nochmal erklären, was ich machen will:
Zahlenfolge von 0 bis n erzeugen. Diese Zahlen werden später als Index benötigt.
Dann die Reichenfolge per Zufall ändern.
Und dann die Zahlen nacheinander per Tastendruck abrufen und weiterverarbeiten.Ja und das habe ich noch immer nicht richtig hinbekommen!
Kann mir nochmals jemand helfen?
-
Funktioniert leider auch nicht!
Komische Fehlermeldung deines Compilers.

Was soll uns das sagen ?
-
Da kommt doch kein Compilerfehler!!!!!!!!!!!!!!! Habe ich irgendwas von Compilerfehler erzählt!
Beim ausführen kommt einfach nicht der entsprechende Wert, sondern irgendwas mit "23423432423", also ein leerer Vector!!!
-
evil-peter schrieb:
Da kommt doch kein Compilerfehler!!!!!!!!!!!!!!! Habe ich irgendwas von Compilerfehler erzählt!
nein
evil-peter schrieb:
Beim ausführen kommt einfach nicht der entsprechende Wert, sondern irgendwas mit "23423432423", also ein leerer Vector!!!
das hast du uns auch nicht erzählt. zeig doch mal den exakten code, den du jetzt getestet hast. der von akari kann es ja nicht sein, denn dort ist noch ein fehler enthalten (der zu einem fehler beim compilieren führt).
-
Nein den habe ich so natürlich nicht übernommen! Ich habe das jetzt alles schon wieder umgeändert. Ich habe ja eine funktionierende Version, aber eben nicht als Klasse. Ich möchte das aber gerne als Klasse definieren, um das auch später leichter zu implementieren.
Der Code ist ja im Prizip so, wie ich ihn schon mal gepostet hatte. weiter vorn!!
-
So jetzt habe ich das noch mal so gemacht: Hier der Code:
die Klasse
#pragma once #include <iostream> #include <algorithm> #include <functional> #include <vector> using namespace std ; class Random { public: void zufall(int count); typedef vector<int> IntVector ; typedef IntVector::iterator IntVectorIt; IntVector Numbers; IntVectorIt start; IntVectorIt end; IntVectorIt it; };Der code:
#include "StdAfx.h" #include ".\random.h" void Random::zufall(int count) { for(int k=0; k<count;k++){ Numbers.push_back(k) ; } start = Numbers.begin(); end = Numbers.end(); srand( (unsigned)time( NULL ) ); random_shuffle(start, end) ; it=start; }Und der Aufruf in dem Dialog:
void CRandom_TestDlg::OnBnClickedButton1() { Random test; CString in; in.Format(_T("%d"),*test.it); m_strAusgabe = in; UpdateData (FALSE); }Und da passiert halt das, daß der Vector beim Buttonklick keine werte mehr hat. Da kommt dann aucch ein Absturtz.
Mehr kann ich da jetzt auch nicht zu sagen
-
Das habe ich noch vergessen:
Random test; int Count = 10; test.zufall(Count);Bei Programmstart aufgerufen
Ich habe das mir jetzt noch mal angesehen. Also sobald ich die Klasse Random im Dialog beim klicken wieder aufrufe wird natürlich der Vector wieder gelöscht. Die frage wäre jetzt wie ich den Vector komplett zurückgeben könnte?
-
Das ganze Problem ist wirklich, wie ich den vector nach dem abarbeiten der Funktion gespeichert bekomme. Das mit der Klasse funktioniert ja soweit jetzt.
Muß ich da etwa einfach nur einen anderen Vector in dem Dialog definieren und dann mit dem aus der Klasse gleichsetzen?
-
Hallo
Und da passiert halt das, daß der Vector beim Buttonklick keine werte mehr hat
Doch der vector test.Numbers hat genau die Werte die durch zufall belegt werden.
Da kommt dann aucch ein Absturtz
Mit deinen Debugger hättest du rausgefunden das derZugriffsfehler hier kommt
in.Format(_T("%d"),*test.it);weil du falsch dereferenzierst. Das brauchst du aber auch nicht mehr da du alle Zahlen so auslesen kannst
in.Format(_T("%d"),test.Numbers[0]); // erste Zahl des vectors auslesenbis bald
akari
-
evil-peter schrieb:
void CRandom_TestDlg::OnBnClickedButton1() { Random test; CString in; in.Format(_T("%d"),*test.it); m_strAusgabe = in; UpdateData (FALSE); }Und da passiert halt das, daß der Vector beim Buttonklick keine werte mehr hat. Da kommt dann aucch ein Absturtz.
Mehr kann ich da jetzt auch nicht zu sagenhier wird zufall gar nicht aufgerufen, und it nicht initialisiert. so kann es nat. nicht gehen.
evil-peter schrieb:
Das habe ich noch vergessen:
Random test; int Count = 10; test.zufall(Count);Bei Programmstart aufgerufe
uninteressant. schließlich hat CRandom_TestDlg::OnBnClickedButton1 ja sein eigenes lokales Random objekt.
-
#include <vector> class Random { public: void zufall(int count); typedef vector <int> IntVector; IntVector Numbers; };void Random::zufall(int count) { Numbers.clear(); for(int k=0; k<count;k++) { Numbers.push_back(k); } random_shuffle(Numbers.begin(), Numbers.end()) ; }int main(int argc, char* argv[]) { srand(time(NULL)); Random test; int Count = 10; test.zufall(Count); for (int i=0;i<test.Numbers.size();i++) cout << test.Numbers[i] << " "; return 0; }
-
Ich glaube ihr versteht mich nicht ganz. Im Prizip funktioniert das ja alles. Aber eben nur lokal, d.h. daß der Vektor sobald ich etwas anderes mache wieder leer ist und das will ich halt verhindern!!
Edit:
Die Funktion soll mir den Vektor zurückgeben damit ich in meinem Hauptprogramm damit machen kann, was ich will. Also ich brauche die Zahlenfolge einfach immer wieder.ungefähr so:
Funktion in der Klasse erstellt mir den Vektor mit einer Zahlenfolge von 0 bis n zufällig angeordnet.
Und dann kann ich den vektor in anderen Funktionen weiter verwenden.Und das geht halt noch nicht! Zur Zeit geht es bei mir nur so, daß ich den Aufruf der Randomfunktion und den Vektor dazu nur in dem selben Hauptdialog verwenden kann.
-
Hallo ?
In deiner Instanz "CRandom_TestDlg":
Random test;
-
Es soll ungefähr so funktionieren:
void CRandom_TestDlg::OnBnClickedButton1() { Random test; CString in; if(i==0) { int Count = 10; test.zufall(Count); meins = test.it; //meins ist hier ein deklarierter Vektor im Hauptprogramm in.Format(_T("%d"),test.it[i]); m_strAusgabe = in; UpdateData (FALSE); i++; } else { in.Format(_T("%d"),meins[i]); m_strAusgabe = in; UpdateData (FALSE); i++; } }Also nach jedem Buttonklick soll die nächste Zahl gezeigt werden
-
Nach deinem Ereignis: OnBnClickedButton1() existiert dein Objekt test nicht mehr, und damit auch nicht dein vector.
Wenn du nun dein
Random test;als Member von CRandom_TestDlg nimmst, lebt dein vector auch solange wie dein CRandom_TestDlg.
-
borst schrieb:
Nach deinem Ereignis: OnBnClickedButton1() existiert dein Objekt test nicht mehr, und damit auch nicht dein vector.
Wenn du nun dein
Random test;als Member von CRandom_TestDlg nimmst, lebt dein vector auch solange wie dein CRandom_TestDlg.
Wie soll ich das denn machen?
Habe das jetzt hinbekommen, also einfach die Random test; in die Klassendeklaration von meinen CRandom_TestDlg. Wunderbar, das war es eigentlich nur, was ich brauchte. Vielen Dank dafür.
Schade nur, daß ich dafür so lange Zeit vergeuden mußte
