Armed-Assault.de Twitter
Antwort
 
Themen-Optionen Ansicht
Alt 01.12.2012, 11:15   #1 (permalink)
50 Beiträge
 
Registriert seit: 16.10.2012
Beiträge: 63
Icon5 "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;
sandmanGER ist offline   Mit Zitat antworten
Alt 01.12.2012, 11:34   #2 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von TeRp
 
Registriert seit: 02.04.2003
Ort: San Francisco
Beiträge: 1.919
Standard

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).
TeRp ist offline   Mit Zitat antworten
Alt 01.12.2012, 16:47   #3 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

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;
Vienna ist offline   Mit Zitat antworten
Alt 01.12.2012, 17:47   #4 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von TeRp
 
Registriert seit: 02.04.2003
Ort: San Francisco
Beiträge: 1.919
Standard

Zitat von Vienna Beitrag anzeigen

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)
Meine Lösung tut allerdings wenigstens das, was vom Threadstarter gewünscht wurde. Deine nicht, denn

Zitat von Vienna Beitrag anzeigen

{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.
__________________

TeRp ist offline   Mit Zitat antworten
Alt 01.12.2012, 18:06   #5 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

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.
Vienna ist offline   Mit Zitat antworten
Alt 02.12.2012, 11:10   #6 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von TeRp
 
Registriert seit: 02.04.2003
Ort: San Francisco
Beiträge: 1.919
Standard

Zitat von Vienna Beitrag anzeigen

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 von Vienna Beitrag anzeigen

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.
__________________

TeRp ist offline   Mit Zitat antworten
Alt 02.12.2012, 14:24   #7 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

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
 };
Vienna ist offline   Mit Zitat antworten
Alt 02.12.2012, 14:48   #8 (permalink)
5000 Beiträge
 
Benutzerbild von Xeno
 
Registriert seit: 03.01.2008
Alter: 77
Beiträge: 6.547
Standard

*deleted*

Xeno

Geändert von Xeno (08.12.2013 um 17:25 Uhr).
Xeno ist offline   Mit Zitat antworten
Alt 02.12.2012, 16:09   #9 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von TeRp
 
Registriert seit: 02.04.2003
Ort: San Francisco
Beiträge: 1.919
Standard

Ich muss leider nochmal nörgeln.

Zitat von Vienna Beitrag anzeigen

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.
__________________

TeRp ist offline   Mit Zitat antworten
Alt 02.12.2012, 17:48   #10 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

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
 };
Vienna ist offline   Mit Zitat antworten
Antwort

Stichworte
randwom, script


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
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


Kontakt - HX3.de - Archiv - Nach oben

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