Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism Mehr Speed für Random? (https://www.delphipraxis.net/96329-mehr-speed-fuer-random.html)

Schlabbermampf 22. Jul 2007 18:38


Mehr Speed für Random?
 
Hi Leute!
Bin gerade dabei ein Programm zu basteln mit dem Nahkämpfe im Tabeltop-Spiel Warhammer 40.000 berechnet werden.
hab nur gerade das Problem, dass das Ganze ziemlich langsam läuft...

hier mal der Quelltext von dem Ausschnitt um dens sich dreht:
Delphi-Quellcode:
function wurf (a,w:real):real;
var wa,wr,anw:integer;
begin
 wr:=0;
 anw:=0;
 if a=0 then result:=0 else
  begin
   wa:=0;
    repeat
     wa:=wa+1;
     randomize;
     wr:=random(6)+1;
      if wr>=w then anw:=anw+1
    until wa=a;
 result:=round(anw);
 end
end;
Die Prozedur wurd immer benutzt wenn gewürfelt wird, und das is ziemlich oft der Fall...
a ist die Anzahl der Würfe und w das Ergebnis, dass mit einem Wurf erreicht werden muss.

z.B. greift man mit 5 Attacken an, und muss mit jeder eine 3 oder mehr Würfeln, damit sie den Gegner trifft.

habt ihr ne Idee wie man das Ganze schneller machen könnte als es bis jetzt ist?

mfg Fabian

Nikolas 22. Jul 2007 18:51

Re: Mehr Speed für Random?
 
Das dürfte sich recht einfach optimieren lassen. Könntest du nochmal die Regeln erklären?
Die Wahrscheinlichkeit, mit einem Würfel einen Wert nicht zu erreichen, liegt doch bei etwa (w-1)/6. Die Wahrscheinlichkeit mit keinem von n Würfeln drüber zu kommen, liegt dann eben bei ((w-1)/6)^n. Dann brauchst du nur noch einen einzigen Random aufruf und du bist fertig.

Klaus01 22. Jul 2007 18:53

Re: Mehr Speed für Random?
 
Habe nur etwas grundlegendes:

randomize sollte nur einmal aufgerufen werden, vielleicht beim Start des Programms
und nicht bei jedem Würfeln.

Grüße
Klaus

Nikolas 22. Jul 2007 22:03

Re: Mehr Speed für Random?
 
Wie viele von diesen Würfen musst du denn simulieren? Alternativ gäbe es auch die Möglichkeit eine Liste mit den jeweiligen Wahrscheinlichkeiten im Vorraus zu berechnen und sich dann viele Randoms zu sparen.

Schlabbermampf 23. Jul 2007 00:28

Re: Mehr Speed für Random?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Nikolas
Wahrscheinlichkeit, mit einem Würfel einen Wert nicht zu erreichen, liegt doch bei etwa (w-1)/6. Die Wahrscheinlichkeit mit keinem von n Würfeln drüber zu kommen, liegt dann eben bei ((w-1)/6)^n. Dann brauchst du nur noch einen einzigen Random aufruf und du bist fertig.

könntest du mal den Quellcode dafür aufschreiben? ich wüsste grade nich wie ich das umsetzen soll...

Zitat:

Zitat von Nikolas
Wie viele von diesen Würfen musst du denn simulieren?

man kann eingeben wie oft der kampf direkt hintereinander wiederholt werden soll damit man ein schönes durchschnittliches ergebnis hat, dachte so an 1000 etwa. also ich denke mal die funktion wird schon im vier- oder fünfstelligen bereich oft ausgeführt

Zitat:

Zitat von Klaus01
randomize sollte nur einmal aufgerufen werden, vielleicht beim Start des Programms
und nicht bei jedem Würfeln.

Ich hab das randomize jetzt vor das repeat gesetzt. läuft alles superschnell jetzt, allerdings kommts mir etwas spanisch vor, dass beim Endergebnis, wo angezeigt wird, wer wie oft gewonnen hat und wie oft ein unentschieden erreicht wurde, so nie ein unentschieden auftritt, wenn das das randomize jedoch direkt vor dem random befehl steht kommt es schon ab und zu vor. woran kann sowas liegen?


Edit: Hab jetzt das komplette Projekt gezippt beigefügt.

mfg Fabian

Luckie 23. Jul 2007 01:53

Re: Mehr Speed für Random?
 
Es würde die Lesbarkeit wesentlich erhöhen, wenn du nur den relevanten Teil hier posten würdest und ansonsten dein Projekt an deinen Beitrag anhängen würdest.

Nikolas 23. Jul 2007 17:11

Re: Mehr Speed für Random?
 
Was willst du denn jetzt eigentlich? Einen einzelnen Zug mit mehreren Würfeln durchrechnen, oder ausrechnen, was ein durchschnittlicher Wert für die treffenden Angriffe ist?

Schlabbermampf 23. Jul 2007 17:22

Re: Mehr Speed für Random?
 
ich will nicht den durchschnittlichen wert berechnen, sondern den Spielzug möglichst realistisch ablaufen lassen.
dazu werden eine bestimmte anzahl an würfeln geworfen, wobei jeder einzeln das benötigte ergebnis erzielen muss.

Nikolas 23. Jul 2007 17:27

Re: Mehr Speed für Random?
 
Wenn du aber nur einmal werfen willst, wie kommst du dann auf die 1000?

Schlabbermampf 23. Jul 2007 17:40

Re: Mehr Speed für Random?
 
also, das ganze sieht so aus:

ich greife an, dabei werden trefferwürfe, verwundungswürfe, rettungswürfe etc gemacht, wobei jedesmal diese eine funktion "wurf" verwendet wird.
(zB habe ich mit meinen einheiten insgesamt 20 attacken die auf die 4 ode mehr treffen. die funktion ermittelt dass 15 attacken getroffen haben. die 15 attacken verwunden nun auf die 3+ und die funktion ermittelt dann wieviele getroffene attacken verwunden konnten, usw usw)
dann schlägt mein gegner zurück, auch mit den diversen würfen.
danach nochmal ich, und dann der gegner, solange bis einer von uns beiden keine lebenspunkte mehr hat.
wer gewonnen hat wird dann registriert.

der gesamte vorgang wird jetzt wiederholt, und zwar solange wie man es selbst eingestellt hat, also zB 1000 mal.

am ende steht dann da wer wie oft gewonnen hat und man kann sich ein bild machen wer gegen wen wie anfällig ist etc.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz