![]() |
#1 (permalink) |
![]() Registriert seit: 16.10.2012
Beiträge: 63
|
![]()
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; |
![]() |
![]() |
#2 (permalink) |
![]() ![]() ![]() Registriert seit: 02.04.2003
Ort: San Francisco
Beiträge: 1.919
|
![]()
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. Geändert von TeRp (01.12.2012 um 11:37 Uhr). |
![]() |
![]() |
#3 (permalink) |
![]() ![]() ![]() ![]() Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
![]()
TeRp, noch umständlicher geht´s nicht?
Code:
{if (random 100 < 70) then {_x setDamage _schaden}} foreach list WrackZone; Code:
{if (random 100 < 70) then {_x setDamage 1}} foreach list WrackZone; Code:
{ if (random 100 < 70) then {_x setDamage 1} else {_x setDamage (random 0.8)}} foreach list WrackZone; |
![]() |
![]() |
#4 (permalink) |
![]() ![]() ![]() Registriert seit: 02.04.2003
Ort: San Francisco
Beiträge: 1.919
|
![]() Tut mir leid das du nur mit Auslösern arbeitest und das für dich zu umständlich ist (sind ca. 10 Code-Zeilen) ![]() Meine Lösung tut allerdings wenigstens das, was vom Threadstarter gewünscht wurde. Deine nicht, denn 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. |
![]() |
![]() |
#5 (permalink) |
![]() ![]() ![]() ![]() Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
![]()
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. |
![]() |
![]() |
#6 (permalink) |
![]() ![]() ![]() Registriert seit: 02.04.2003
Ort: San Francisco
Beiträge: 1.919
|
![]() 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. ![]() 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. |
![]() |
![]() |
#7 (permalink) |
![]() ![]() ![]() ![]() Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
![]()
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 }; |
![]() |
![]() |
#9 (permalink) |
![]() ![]() ![]() Registriert seit: 02.04.2003
Ort: San Francisco
Beiträge: 1.919
|
![]()
Ich muss leider nochmal nörgeln.
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. |
![]() |
![]() |
#10 (permalink) |
![]() ![]() ![]() ![]() Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
![]()
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 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 }; |
![]() |
Stichworte |
randwom, script |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
![]() |
||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Kampfmodusänderung ohne Befehl? | 123justin321 | Editing & Scripting | 9 | 18.05.2012 22:05 |
Befehl im Befehl | *Wolf* | Editing & Scripting | 17 | 29.04.2011 14:30 |
sleep befehl | miromanu | Editing & Scripting | 10 | 11.09.2010 01:26 |
switchLight befehl | miromanu | Editing & Scripting | 5 | 20.08.2010 05:15 |
Befehl für Laser an Waffe | Spiderman | Editing & Scripting | 4 | 21.07.2010 23:22 |