Untersuchung "If Rand(AC)>Rand(DC)"
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
FirstdeathmakerBetreff: Untersuchung "If Rand(AC)>Rand(DC)" |
Mi, Aug 31, 2005 19:13 Antworten mit Zitat |
|
---|---|---|
Ich untersuche gerade die einfache Zeile "If Rand(AC)>Rand(DC)"
Ich möchte ermitteln nach welchem Prinzip die True Quoten erfüllt werden, und dann eine große Menge an Rechnungen vereinfachen. Bisher bin ich soweit gekommen, das ich die Warscheinlichkeit, mit der True erfüllt wird, berechnen kann. Somit bekomme ich, wenn ich eine große Anzahl an Rechnungen damit durchführe, schonmal einen Mittelwert heraus. Das ganze wird für einen Kampfsimulator gebraucht, der große Mengen von Raumschiffen gegeneinander simuliert kämpfen lässt, und trotzdem recht fix funktioniert. Jedes Raumschiff hat eine bestimmte Anzahl an Kanonen, eine bestimmte Trefferchance [AC] (Aber nicht in Prozent angegeben) und eine bestimmte Verteidigungschance [DC] (Auch nicht in Prozent). Um zu schauen ob eine Kanone getroffen hat, wird jetzt die Zeile "if Rand(AC)>Rand(DC)" aufgerufen. Nun ist eben das Problem, dass bei Schiffszahlen von 10000> das Programm, wenn man alle Schiffe einzeln prüft, zu langsam wird. Deshalb suche ich eben nach einer Möglichkeit, dieses zu beschleunigen, und bin dabei eben an der Stelle stecken geblieben, an der ich zwar den Mittelwert der Treffer ausrechnen kann (Also die warscheinlichste Anzahl der Treffer), suche nun aber eben nach einer Funktion die diese Trefferzahl noch durch Warscheinlichkeit modifiziert, sodass am Ende eine Ähnliche Warscheinlichkeitskurve erzeugt wird wie im vorgegebenen Beispiel zu sehen: Code: [AUSKLAPPEN] SeedRnd MilliSecs()
Global AC:Int =100 Global DC:Int = 80 Global Kanons:Int = 200 Local counterA :Int Local counterD :Int For i = 1 To Kanons If Rand(AC)>Rand(DC) counterA:+1 Else counterD:+1 EndIf Next Print "Treffer: "+counterA+" / "+Kanons If CounterD>CounterA Print "Verh.: 1:"+Float(CounterD)/CounterA Else Print "Verh.: "+Float(CounterA)/CounterD+":1" EndIf DCtmp = DC + 1 If AC=DC AR = (AC*AC+AC)/2.0 DR = (DCtmp*DCtmp+DCtmp)/2.0 'Print "Berechnetes: "+ AR+ "/" + DR 'Print "VH: 1 : "+ DR*1.0/AR ElseIf AC>DC DCAC = Abs(AC - DCtmp) AR = (AC*AC+AC-DCAC*DCAC-DCAC)/2.0 DR = (DCtmp*DCtmp+DCtmp)/2.0 'Print "Berechnetes: "+ AR+" / "+ DR 'Print "VH: "+AR*1.0/DR+" : 1" ElseIf AC<DC DCAC = Abs(AC - DCtmp) AR = (AC*AC+AC)/2.0 DR = (DCtmp*DCtmp+Dctmp-DCAC*DCAC+DCAC)/2.0 'Print "Berechnetes: "+ AR +"/" + DR 'Print "VH: 1 : "+ DR*1.0/AR EndIf 'Prozente ausrechnen: Aprozent:Float = 1.0/(AR+DR)*AR Dprozent:Float = 1.0/(AR+DR)*DR Print Int(Kanons*Aprozent) ' Test Local ordner[401] Graphics 400,300,0 Repeat counterA = 0 For i = 1 To Kanons If Rand(AC)>Rand(DC) counterA:+1 EndIf Next ordner(Int(Float(counterA)/Kanons*400)):+1 SetColor 255,100,100 DrawLine Int(Aprozent*400),0,Int(Aprozent*400),300 SetColor 255,255,255 For i = 0 To 400 DrawLine i,300-ordner(i),i,300 Next Flip Until KeyHit(KEY_ESCAPE) End |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
bruZard |
Mi, Aug 31, 2005 19:29 Antworten mit Zitat |
|
---|---|---|
Vermeide einfach Entity-Zahlen > 10000 ... wenn Du das lösen kannst darfst Du sicher sein dass Du der Erste bist der das getan hat.
In der Regel fasst man bei grösseren Zahlen die Gesamtmenge in Gruppen zusammen und berechnet nur deren Eigenschaften ... bei 10.000 Einheiten würde ich eine Grösse von 10 Einheiten pro Gruppe wählen was bewirkt dass ich "nur noch" 1000 Einheiten kalkulieren muss. |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
Firstdeathmaker |
Mi, Aug 31, 2005 19:46 Antworten mit Zitat |
|
---|---|---|
Hmm, dadurch wird das ganze aber zu ungenau, ich würde gerne eine sauberere Lösung dafür haben. Wenn jmd Ideen dazu hat, immer her damit. Muss ja kein kompletter Lösungsvorschlag sein. | ||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group