Untersuchung "If Rand(AC)>Rand(DC)"

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Firstdeathmaker

Betreff: Untersuchung "If Rand(AC)>Rand(DC)"

BeitragMi, Aug 31, 2005 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Aug 31, 2005 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Aug 31, 2005 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group