Windows Forms + Zufallszahlengenerator

RaikMon

Grünschnabel
Hi hab mich nun auch angemeldet, da ich einfach keine Lösung zu meinem Problem finde :).

Da wir seit letztem Jahr in der Schule programmieren und heuer in Visual Studio mit Windows Forms Anwendungen arbeiten hab ich ein neues "Hobby" gefunden.

Zu meinem Problem:

Ich versuche für ein kleines Spiel herauszufinden, wie ein solcher Zufallsgenerator (im leichtesten Fall eben mit Zahlen) funktioniert.

Zum "üben" will ich einen ganz simplen Lottozahlengenerator machen, der durch einen Klick auf den Button "Lottozahl generieren" eine zufällige Zahl zwischen 1 und 45 in einer Textbox ausgeben soll.

Wie gesagt ich bin noch Anfänger in Sachen Windows Forms und auch in C++, da wir letztes Jahr in C programmierten.

Über jede Hilfe wäre ich dankbar!

Mfg,
RaikMon
 
Die meisten Sprachen haben einen (Pseudo-)Zufallszahlengenerator eingebaut. Da musst du dir im Grunde nur noch die Mühe machen, die erzeugte Zufallszahl im gewünschten Rahmen zu begrenzen. Unter .NET findest du einen Generator im Namespace System.Random.

Wenn du dich wirklich selber an Zufallszahlen wagen willst, ist das im Grunde nur von deiner Phantasie abhängig. Ein ganz billiger Generator lässt sich in drei Zeilen basteln (eine, wenn man es gerne unleserlich mag), der ist dann aber auch nicht ganz so ausgereift (verteilt die Zufallszahlen nicht unbedingt gleichmässig). Weiterführendes kannst du in Wikipedia nachlesen: http://de.wikipedia.org/wiki/Zufallszahlengenerator
 
Hey vielen dank für deine Antwort

Also eine tolle -Frage von mir... .NET, namespace blablabla^^ damit kann ich (muss ich zu meiner schande gestehen) nichts anfangen.

Und mit dem generator in 3 zeilen könntest du den code ma kurz reinschreiben bitte? :)

Ich hab auch schon sachen gefunden die in den besagten 3 zeilen geschrieben werden mit der funktion "srand" hab das auch schon ordentlich versucht aber nicht wirklich hinbekommen, kam immer error.

EDIT: ah hab nun oben zu den namespaces "using namespace System::Random;" hingeschrieben nur wies weitergeht weiß ich nicht sry :(
Danke
Mfg, RaikMon
 
Zuletzt bearbeitet:
Ach so, du benutzt managed C++?

Das benutze ich nicht, weil ich die Syntax etwas eigen finde. Ich nehme da lieber direkt C#. Aber das müsste ich auch noch hinkriegen.

Versuch mal so:

Code:
// Neuen Zufallszahlengenerator erzeugen, der seed wird intern von einer zeitbasierten Quelle erzeugt
System::Random   Generator = gc_new System::Random();

// Zufallszahl von 0 bis 9:
int iRandom = Generator.Next( 10 );

Ich habe mich bestimmt bei der Syntax etwas vertan, aber das kriegst du schon hin.

Hinweis: Der Zufallszahlengenerator sollte nur EINMAL erzeugt werden, danach immer weiter verwenden. Auf jeden Fall dann, wenn du den Constructor mit einem Parameter nimmst, da der Seed ja dann immer gleich ist.
 
Danke erstmal.

Ich habe mich bestimmt bei der Syntax etwas vertan, aber das kriegst du schon hin.

Denkste *g*.

zu dem gc_new ... ich hab anfangs nichts damit anzufangen gewusst, aber als ich dann oben mehrere Befehle fand die gcnew heißen korrigierte ich das mal, er spuckt mir leider trotzdem noch einen fehler aus:

Visual Studio hat gesagt.:
Fehler 1 error C2664: 'System::Random::Random(int)': Konvertierung des Parameters 1 von 'System::Random ^' in 'int' nicht möglich d:\programme\zufalls zahlen generator\zufalls zahlen generator\Form1.h 98

Da ich ned gewusst hab wo des hingehört, hab ichs einfach unter meinen Button reingeschmissen...das is wohl der Fehler!? (Ich bin ne schwere Geburt, ich weiß)

Code:
private: System::Void butGenerate_Click(System::Object^  sender, System::EventArgs^  e) 
			 {
				 System::Random   Generator = gcnew System::Random();

				 int iRandom = Generator.Next(10);
			 }

Vielen Dank

Mfg, RaikMon
 
Zuletzt bearbeitet:
Ok das mit den namespaces hab ich jetzt gelernt, hab vorhin ja keine ahnung gehabt.

Hab mittlerweile schon sämtliche Bücher durchblättert und Hilfsdateien aber nichts. Immer derselbe Fehler und ich finde einfach keine Lösung....ich hoffe ich finde nun doch noch bei euch Hilfe!

Mfg,
RaikMon
 
Hi,
warum muß es denn gcnew sein?
Versuche mal
Code:
Random generator = new Random();
int n = generator.Next(10);
Vorher bitte den Namespace System einbinden (meistens schon geschehen). gcnew unterscheidet sich von new darin, daß das Objekt auf dem GarbageCollector-Heap angelegt wird, new nimmt den Heap. Vielleicht liegt es ja daran.

Mfg

langer
 
Hi danke für deine Antwort :D

Also mit deinem Code spuckt er mir wieder einen Fehler und zwar dass ich gcnew verwenden soll *g*

Dann hab ich das gemacht und er schreibt wieder den alten Fehler hin :(.

Mfg,
RaikMon

EDIT:

also hier nochmal der Fehler bei deinem Code:

d:\programme\zufall\zufall\Form1.h(98) : error C2750: "System::Random": "new" kann für den Verweistyp nicht verwendet werden. Verwenden Sie stattdessen ''gcnew''.
d:\programme\zufall\zufall\Form1.h(98) : error C2664: 'System::Random::Random(int)': Konvertierung des Parameters 1 von 'System::Random *' in 'int' nicht möglich
Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
 
Ja,
sorry, du machst ja managed Code. Mein Vorschlag stammt von C#. Hab ich verwechselt.
Aber da der Zufallsgenerator nur einmal erzeugt werden sollte, instanziiere ihn doch mal in der Initialisierungsphase des Programms. Da ich managed Code nicht mache, weiß ich jetzt nicht genau, wo das ist. Aber bevor die Messageloop zu laufen beginnt. (In C++ würde ich das in InitInstance() legen.) Und dann beim Klick immer nur die Next-Methode aufrufen.

Mfg

langer
 
Also,...

Du musst dir zuerst einmal im Klaren sein, ob du managed (verwaltenden) oder unmanaged Code verwenden willst

Wenn du managed C++ verwendest, instantierst du Variablen mittels gcnew, und verwendest um auf die Properties oder Funktionen zugreifen zu können ->
bei unmanaged erstellst du Objekte mit new und verwendest einen Punkt .

Klar soweit?

Also um deinen Zufallsgenator zu schreiben:

Du musst den namespace System::Random nicht unbedingt verwenden (also bei mir gehts zumindest ohne...)

Zuallererst brauchst du eine Variable, die den Zufallsgenerator darstellt. Diese initialisierst du am Besten in einer Inititalize Methode (dort wo glaub ich auch deine Buttons erstellt, benannt und die Eigenschaften festgelegt werden)
C++:
System::Random ^ m_random = gcnew System::Random()
das ^ markiert den Zufallsgenerator als managed und deshalb gcnew

Jetzt kannst du eine Zufallszahl mittels der Funktion Next erstellen:
C++:
int Zahl = m_random->Next(1, 45);
Dabei geben die Parameter in der Klammer den Zahlenbereich an, also hier zwischen 1 und 45

Klar soweit?

Hoffe ich hab dir helfen können,
mfg, Keep it G33K

Leitman
 

Neue Beiträge

Zurück