HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   "random"-befehl in Schleife (https://hx3.de/editing-scripting-167/random-befehl-schleife-22068/)

sandmanGER 01.12.2012 10:15

"random"-befehl in Schleife
 
Hallo,

weiß mal wieder nicht weiter :)

Und zwar sollen in einem Auslöserbereich rund 70 % der vorhandenen Autos zerstört werden. Wie kriegt man das hin, dass der Zufallwert für jedes einzelne Fahrzeug ermittelt wird? Oder das zu Anfang feststeht, dass rund 70% der Fahrzeuge zerstört werden. Mir wäre allerdings der erste Lösungsweg lieber.


Code:

{_x setFuel 0} foreach list WrackZone;
{_x setAmmoCargo 0} foreach list WrackZone;


_schaden = random 0.9 + 0.6;
{_x setDamage _schaden} foreach list WrackZone;
//das betrifft ja alle Autos


{ if (_x isKindOf "Car") then {_x enableSimulation false} } forEach list WrackZone;


TeRp 01.12.2012 10:34

Stupider, absolut einfacher Ansatz:

1. Anzahl Fahrzeuge im Bereich zählen, Anzahl zerstörter Fahrzeuge auf 0 stellen.

2. Durch alle Fahrzeuge laufen.

3. Für jedes Fahrzeug:
3.1 Überprüfen ob 70% schon zerstört sind.
3.1.1 Falls ja, beenden
3.1.2 Falls nein, weiter
3.2 Überprüfen ob Fahrzeug schon zerstört
3.2 Falls nicht zerstört, zufällig entscheiden, ob es zerstört wird oder nicht.
3.2.1 Falls ja, Anzahl zerstörter Fahrzeuge um 1 erhöhen.
3.2.2 Falls nichts, nichts tun

4. Falls noch nicht 70% zerstört, zurück zu 2

Die Umsetzung solltest du mittlerweile selber hinkriegen.

Vienna 01.12.2012 15:47

TeRp, noch umständlicher geht´s nicht?


Code:

{if (random 100 < 70) then {_x setDamage _schaden}} foreach list WrackZone;
Wenn keine unterschiedlichen Schäden erwünscht sind, sondern 70% Totalschaden:
Code:

{if (random 100 < 70) then {_x setDamage 1}} foreach list WrackZone;
Sollen 70% zerstört und der Rest beschädigt sein:
Code:

{ if (random 100 < 70) then {_x setDamage 1} else {_x setDamage (random 0.8)}} foreach list WrackZone;

TeRp 01.12.2012 16:47

Zitat:

Zitat von Vienna (Beitrag 436541)
TeRp, noch umständlicher geht´s nicht?

Tut mir leid das du nur mit Auslösern arbeitest und das für dich zu umständlich ist (sind ca. 10 Code-Zeilen) :p
Meine Lösung tut allerdings wenigstens das, was vom Threadstarter gewünscht wurde. Deine nicht, denn

Zitat:

Zitat von Vienna (Beitrag 436541)
{if (random 100 < 70) then {_x setDamage _schaden}} foreach list WrackZone;

ist leider Mist.
Hier werden nicht 70% der Fahrzeuge beschädigt, sondern jedes Fahrzeug in der Liste wird mit einer Wahrscheinlichkeit von 70% beschädigt.
Also leider nicht das gefragte, denn die Anzahl der insgesamt beschädigten Fahrzeuge ist damit komplett zufällig.

Entsprechend zieht sich der Fehler schön durch alle deine Lösungsvorschläge.

Vienna 01.12.2012 17:06

Ob er diese Zeilen in einen Auslöser oder Skript reinschreibt ist unwesentlich. sandmanGER will hier ein zufälliges Ergebnis (rund 70%). Für die von ihm gewünschte Anwendung (ca. 70% zerstörte Fahrzeuge die im Auslöserbereich rumstehen) es ist doch völlig egal ob es dabei 10% Abweichung gibt.

Mein erstes Beispiel ist an seine Codezeile angepasst. Aber es gibt ja auch noch weitere Beispiele.

Soweit ich sandmanGER einschätze, ist er mit deinem Vorschlag überfordert.

TeRp 02.12.2012 10:10

Zitat:

Zitat von Vienna (Beitrag 436551)
Soweit ich sandmanGER einschätze, ist er mit deinem Vorschlag überfordert.

Da stimme ich dir zu, aber deswegen kann ich ihm ja trotzdem eine korrekte Lösung posten. Vorkauen muss ich ihm ja deswegen trotzdem nichts. ;)

Zitat:

Zitat von Vienna (Beitrag 436551)
Für die von ihm gewünschte Anwendung (ca. 70% zerstörte Fahrzeuge die im Auslöserbereich rumstehen) es ist doch völlig egal ob es dabei 10% Abweichung gibt.

Es sind aber eben nicht nur 10% Abweichung!
Du hast für jedes Fahrzeug eine Wahrscheinlichkeit von 70%, beschädigt zu werden. Die Wahrscheinlichkeit bei dir, dass von insgesamt m + n Fahrzeugen, n beschädigt sind, ist p = 0.7^n * 0.3^m.
Da kommst du bei deiner Lösung so gut wie garnicht auf 70%!

Die Lösung von mir tut aber genau das, und zusätzlich ist die Entscheidung, welche Fahrzeuge beschädigt werden, auch noch zufällig. Es sind also nie immer nur die ersten n Fahrzeuge beschädigt, sondern n zufällig ausgewählte.

Vienna 02.12.2012 13:24

Hast recht! Bei meinen Vorschlägen können es maximal 70% werden. Was selten der Fall sein wird.

Ausgehend davon, weil zerstörte Fahrzeuge nicht mehr in der Liste WrackZone vorhanden sind, scheint mir dann diese Lösung ausreichend:
Code:

_max = count list WrackZone * 0.7;
_akt = 0; 
while {_akt < _max} do
 {
  {if (random 100 < 30) then {_x setDamage 1; _akt = _akt+1}} foreach list WrackZone
 };


Xeno 02.12.2012 13:48

*deleted*

Xeno

TeRp 02.12.2012 15:09

Ich muss leider nochmal nörgeln.

Zitat:

Zitat von Vienna (Beitrag 436654)
Hast recht! Bei meinen Vorschlägen können es maximal 70% werden. Was selten der Fall sein wird.

Bei deiner Lösung können auch alle ganz bleiben oder alle kaputt sein, auf die 70% kommst du nicht.

Du überprüfst ja für jedes Fahrzeug random 100 < 70. Also kann im Endeffekt jedes Fahrzeug zerstört werden, nämlich immer dann, wenn random jedes mal weniger als 70 zurückliefert. Die Ereignisse sind ja in deinem Script unabhängig von einander.
Daher bei mir die Zählvariable: die stellt sicher, dass genau 70% nachher kaputt / beschädigt sind.

Dein neuer Ansatz ist besser!
Der geht ja im Prinzip auch in meine Richtung, nur das ich bei mir noch die zufällige Auswahl der Fahrzeuge algorithmisch etwas stärker betont habe.

Vienna 02.12.2012 16:48

TeRp, wieder richtig! Bei den ersten Vorschlägen können es auch auch 0 oder 100% sein.

Aber mit dem letzten Beispiel ist das alles nicht mehr möglich.

Xeno, solche Serien sind in einem Menschenleben unmöglich! Für 100 Objekte benötigt das Programm unter 0,5 Sekunden.

Hier das Ergebnis vom letzten Beispiel bei 100 Fahrzeugen:
Code:

Gesamt Objekte  : 100
Start            :  3.121
Ende            :  3.423
Dauer            :  0.302 Sekunden
zerstörte Objekte:  68

Das Ergebnis liegt zwischen 61 und 71% zerstörter Fahrzeuge.

Hier der Code zum Testen. Die eigentliche Routine ist fett dargestellt.
Code:

temp  = 0 spawn 
 {
  _ObjSt = count list WrackZone;
  _zeit1 = time;
  _max  = count list WrackZone * 0.7;
  _akt  = 0;
  while {_akt < _max} do
  {
    {if (random 100 < 30) then {_x setDamage 1; _akt = _akt+1}} foreach list WrackZone
  };

  _zeit2 = time;
  hint "5 Sekunden warten! (Es dauert bis alle Objekte auf den Zerstören-Befehl reagieren.)";
  sleep 5;
  _ObjEn = count list WrackZone;
  _ergebnis = format["Gesamt Objekte: %1\nStart:  %2\nEnde: %3\nDauer: %4\nzerstörte Objekte: %5", _ObjSt, _zeit1, _zeit2, _zeit2 - _zeit1, _ObjSt - _ObjEn];
  hint _ergebnis;
  copyToClipboard _ergebnis
 };



Alle Zeitangaben in WEZ +1. Es ist jetzt 20:01 Uhr.

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias


SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119