Urnenmodell
-
Hallo,
Roadda schrieb:
Ich steh irgendwie aufm Schlach und komm nicht drauf, wie die erste Ziehung aussehen muss...
in der Annahme, dass du verstanden hast, wie du es auf'm Papier machen musst, wenn dein Lehrer mit ner Wahrscheinlichkeits-Aufgabe kommt, sage ich dir: Nimm ein Beispiel, mach es auf'm Papier und übertrage es dann.
MfG
GPC
-
Wie das ganze mathematisch aussieht, ist mir klar...aber ich weiß nicht mit welchen Mitteln ich es umsetzen muss...
Aufm Papier bei ner Urne mit Wiederholung und mit Berücksichtigung der Reihenfolge nehm ich bei der 1. Ziehung ein Los heraus und leg es danach wieder zurück, also folgende Formel: Losanzahl hoch Ziehungen...
aber wie setz ich das jetzt um???
-
Roadda schrieb:
Wie das ganze mathematisch aussieht, ist mir klar...aber ich weiß nicht mit welchen Mitteln ich es umsetzen muss...
Aufm Papier bei ner Urne mit Wiederholung und mit Berücksichtigung der Reihenfolge nehm ich bei der 1. Ziehung ein Los heraus und leg es danach wieder zurück, also folgende Formel: Losanzahl hoch Ziehungen...
aber wie setz ich das jetzt um???Es geht ja gar nicht um Formeln, es geht darum, ein Modell einer Urne nachzuprogrammieren. Eine Urne weiß nichts von Binominalverteilungen.
Ich würde eine Urne so programmieren, daß sie intern weiß, wie viele rote und wie viele schwarze Kugeln sie enthält und nach diesen Wahrscheinlichkeiten gibt die ziehe-Methode der Urne auch Kugeln heraus. Sinnhafter Weise würde ich zwei ziehe-Methoden: ziehe_mit_rausnehmen und ziehe_ohne_rausnehmen oder so. Das protokollieren der Reihenfolge ist in meiner Welt keine typische Aufgabe der Urne (ich benutze auch die gleiche Urne für ziehen mit und ohne Relevanz der Reihenfolge), sondern eine des Versuchsleiters mit seinem Schreibblock. Aber sei's drum: wenn die Reihenfolge relevant ist, dann belege ich halt ein Feld mit k Stellen (bei k mal rausnehmen) in der entsprechenden Reihenfolge mit rot oder schwarz. Ist das nicht gefordert, reicht es einfach eine Strichliste für rot und schwarz zu führen, also einfach ein paar Ints raufzuzählen.
-
Die einzelnen Methoden, die ich benötige, habe ich mir schon erarbeitet, aber was in die einzelnen Methoden reingehört, weiß ich nicht...
Wie würde denn z.B. dein ziehe_mit_rausnehmen Methode aussehen?Hab grad erst mit objektorientierter Programmierung begonnen und blick noch nicht so ganz durch und unser Prof bringt das ganze nicht wirklich verständlich rüber...
-
Ist doch eigentlich ganz einfach.
Zutaten:
1 Urne (je nach Geschmack eine Menge1 oder Multimenge2)
1 Schreibblock (entweder in Mengen-, Multimengen- oder Listenform3)Zubereitung:
Zunächst die Urne mit n Losen füllen. Danach zufällig4 k Lose aus der Urne ziehen und auf dem Block notieren. Die Lose entweder gleich zurück in die Urne legen oder wegschmeissen5.1 std::set
2 std::multiset
3 std::list
4 std::rand
5 container.erase
-
Wir haben aber set, list und dergleichen noch gar nicht besprochen...gibt es auch einen anderen Lösungsweg?
-
Ja, du kannst stattdessen auch ein plumps Array verwenden und von Hand durchackern - ist aber um einiges aufwändiger.
(oder du schaust ins Magazin (recht weit unten im Forum) und liest dir meinen Artikel über die STL-Container durch)
-
[quote="finix"]Zubereitung:
Zunächst die Urne mit n Losen füllen. Danach zufällig4 k Lose aus der Urne ziehen und auf dem Block notieren. Die Lose entweder gleich zurück in die Urne legen oder wegschmeissen5....und genau da hackt es: wie muss ein "Lose ziehen" oder "Lose zurücklegen" im Quelltext aussehen?
-
Naja, das ziehen ist recht simpel. Eigentlich musst du dafür nur einen zufälligen Wert auslesen. Beim Array wäre das etwa:
unsigned int index = std::rand () % anzahl; int los = urne[index];
Beim set würde man wohl den Zufallswert nehmen und einen iterator solange itererieren lassen:
unsigned int index = std::rand () % urne.size (); std::set<int>::iterator iter = urne.begin (); for (int i = 0; i < index; ++i) ++iter;
Wenn du dann nicht direkt zurücklegst, dann musst du das Element löschen. Da das aber für ein Array eine ziemliche Arbeit ist (es sei denn du führst ein "ungültiges" Los wie -1 ein oder machst ein set der gültigen Indizes), ist das set (oder noch besser: ein std::vector) praktikabler:
block.insert (*iter); urne.erase (iter);
-
man könnte ja auch
struct Los { int nummer; bool gezogen; };
Das ist auf jeden fall sehr einfach
-
KingOfTheBlueMouse schrieb:
man könnte ja auch
struct Los { int nummer; bool gezogen; };
Das ist auf jeden fall sehr einfach
Das sieht doch schon mal viel bekannter aus, aber wie bau ich das jetzt in meinen Quelltext?
Tut mir leid, wenn ich mit meinen Fragen langsam nerve, aber bin halt noch ziemlich frisch in der Materie...
-
struct Los { int nummer; bool gezogen; }; class LosAutomat { private: int size; int gezogen; int lose_pro_runde; Los *lose; public: LosAutomat(int size, int lose_pro_runde ) { lose = new Los[size]; gezogen = 0; this->size = size; this->lose_pro_runde = lose_pro_runde ; for( int i = 0 ; i < size ; i++ ) { lose[i].nummer = i; lose[i].gezogen = false; } }; bool Ziehen() { int index; for(int i = 0; i < lose_pro_runde && gezogen < size ; ) { index = rand() % size; if(!lose[index].gezogen ) { cout << "Gewonnen hat " << lose[index].nummer << endl; lose[index].gezogen = true; i++; gezogen++; } } if( gezogen < size ) return true; else return false; }; };
so ungefair ?
[Edit] Wow das geht ja sogar