Einzelnen Beitrag anzeigen

Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#15

Re: Mehr Speed für Random?

  Alt 23. Jul 2007, 21:59
Hast du noch nicht mit arrays gearbeitet? Dem einfachsten Listentyp? So was wie Mylist0]?
Schau die einfach mal das Thema in der OH an, das wirst du sofort verstehen.
Meine Idee sah so aus (da ich nicht weiss, wie schnell random eigentlich ist, weiss ich nicht, ob sie schneller ist, als deine Methode): Du berechnest die Wahrscheinlichkeit, dass von deinen n Würfeln genau k treffen.
Die Wahrscheinlichkeit dafür beträgt
Code:
P(k)=(n k)*p^k*(n-p)^(1-p)
, das p steht für die Wahrscheinlichkeit, dass ein Würfel trifft; im Fall, dass du mindestens eine 4 Würfeln musst, beträgt p dann 4/6=2/3. Das (n k) soll ein Binomialkoffezient sein, das Ganze ist eine Binomialverteilung. (einfach in die Wikipedia schauen).
Jetzt legst du dir eine Liste an. Die zu berechnen dürfte nicht allzu lange dauern, dass kannst du einmal beim Programmstart machen. Jetzt wird es etwas fies, da du gleich eine nette Arraykonstruktion hast, obwohl du damit noch nicht gearbeitet hast. Also eine kurze Einführung: ein array ist eine geordnete Anordnung von Variablen des gleichen Typs. Anstatt also 5 integer, int0, int1, ..., int4 zu definieren, kannst du auch eine Liste mit so vielen Integern anlegen, wobei du die einzelnen Werte dann mit MyIntegerList[0]:=1; könntest du dann einfach einen Wert an die erste (!) Stelle des arrays legen und auch genauso auslesen. Für mehr Info gibts die OH.
So eine Liste kannst du auch mehrdimensional anlegen.
Hier wäre eine dreidimensionale Liste angebracht. Eine Dimension wäre die Anzahl der Würfel im Spiel (n), eine andere Dimension wäre die Anzahl der Augen auf deinem Würfel. (Das kannst du dir einfach wie ein Koordinatensystem vorstellen) Wenn du in diesem System auf eine Stelle schaust, hast du da die Kombination aus der Anzahl der Würfel, die in diesem Zug gespielt werden, als auch die Wahrscheinlichkeit, dass einer dieser Würfel trifft (aus der zweiten Koordinate, die dann die Augenzahl angibt, die erreicht werden muss). An dieser Stelle hast du jetzt noch eine Liste mit n Einträgen, nämlich den Wahrscheinlichkeiten, dass keiner, einer,..., alle Würfel treffen. Wie du vielleicht aus der Schule mal gehört hast, müssen sich diese Wahrscheinlichkeitn zu 1 aufaddieren. (die Wahrscheinlichkeit, dass eine irgendeine Anzahl an Würfeln gewinnt, ist sicher gleich 1). Diese Liste kannst du dir jetzt wie eine Art Glücksrad vorstellen, das in n Gebiete unterteilt ist, die unterschiedlich groß sind. (Wenn du 100 Würfel hast und mindestens eine vier Würfeln musst, ist die Wahrscheinlichkeit, dass 50 Würfel treffen deutlich höher, als die Wahrscheinlichkeit, dass nur 10 Würfel treffen). Jetzt musst du nur noch einen Ball in dieses Glücksrad werfen und schauen, wo er liegen bliebt. Du machst also einen einzelnen randomAufruf und bekommst eine Zahl x.
Du hast schon eine Liste p(k), in der steht, wie Wahrscheinlich es ist, dass k Würfel treffen. Jetzt schaust du dir die p(k) der Reihe nach an und suchst das erste k', so dass p(k')>x. Dieses k' gibst du dann aus. Nach dem Berechnen der Liste, hast du also nur noch ein paar ( recht genau log_2(n) bei Binärsuche) if-Abfragen, die schneller sein sollten, als ein paar RandomAufrufe. Schön, dass du bis hier noch gelesen hast. Wenn du das Projekt wirklich durchziehen willst, und dir dabei noch etwas Stochastik anlesen willst, (Niveau 10. Klasse Gymnasium, wenn du es noch nicht hast), kann ichs nochmal schöner aufschreiben und vielleicht etwas Code liefern. Ich hoffe du erkennst die Idee wenigstens in den Grundzügen, wenn nicht, bitte fragen , ich finde das Problem selbst recht interessant.
Wikipedia:Binomialkoeffizient, Bimomialverteilung, (Binarysearch, wenn du noch Lust hast, klappt auch ohne)
OH: statische Arrays (in mehreren Dimensionen), setzen der Länge solcher
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat