• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

Suche *meldungs~Script

Was denn, 2 tage und keine Resonanz?
Persönlich halt ich das Ding für einen Overkill und Deine erste Version besser - schon, weil sie im Zweifel Speicher-Sparender ist (bei maximal 200 Zeilen für Modus 1 haben wir 200 * 254 Zeichen = 50,800 bytes + List-Overhead... und damit im Extremfall das Script überladen. Ja, nur im Extremfall - aber genau mit den Extremfällen "0 und leere NC" und "komplett gefüllt" muss der Programmierer eben rechnen.)

Trotzdem... schön aufgebaut. Ich würde llGetListLength(Chatausgaben) in eine globale Variable schreiben - Listenoperationen sind chronisch langsam, und dieser Wert ändert sich nach dem Einlesen nicht mehr. Einen kleinen Logikfehler hast Du da auch drin:
Code:
llWhisper(0, llList2String(Chatausgaben, llFloor(llFrand(llGetListLength(Chatausgaben)+1))));
Auch Arra... Verzeihung, Listen werden von 0 - (Länge - 1) gezählt, also willst Du einen llFloor(llFrand( ListenLaenge )) - ohne das "+1" (wie bei der Auswahl der Zeilen ja auch)

Okay, soviel Betrachtung vom Trockendock aus... probieren sollen es die Anwender ;-))
(Nein, ich sag nichts zu dem "Modus = 1;" im dataserver-Event... der Gewinn an Lesbarkeit hebt jeden "Nachteil" der Zuweisung m.E. bei weitem auf)
 
Was denn, 2 tage und keine Resonanz?
Persönlich halt ich das Ding für einen Overkill und Deine erste Version besser - schon, weil sie im Zweifel Speicher-Sparender ist (bei maximal 200 Zeilen für Modus 1 haben wir 200 * 254 Zeichen = 50,800 bytes + List-Overhead... und damit im Extremfall das Script überladen. Ja, nur im Extremfall - aber genau mit den Extremfällen "0 und leere NC" und "komplett gefüllt" muss der Programmierer eben rechnen.)
Ich hatte das eigentlich (dachte ich) ziemlich genau berechnet, und meiner Meinung nach müßte es mit dem Speicherverbrauch klappen, wenn auch recht knapp. :)
Und du hast natürlich recht, 0 und leere NC muß ich noch einbauen.

Trotzdem... schön aufgebaut. Ich würde llGetListLength(Chatausgaben) in eine globale Variable schreiben - Listenoperationen sind chronisch langsam, und dieser Wert ändert sich nach dem Einlesen nicht mehr.
Jap, vollkommen richtig, sollte noch verbessert werden.

Einen kleinen Logikfehler hast Du da auch drin:
Code:
llWhisper(0, llList2String(Chatausgaben, llFloor(llFrand(llGetListLength(Chatausgaben)+1))));
Auch Arra... Verzeihung, Listen werden von 0 - (Länge - 1) gezählt, also willst Du einen llFloor(llFrand( ListenLaenge )) - ohne das "+1" (wie bei der Auswahl der Zeilen ja auch)
Öhm, das mit dem +1 war schon absicht, immerhin runde ich mit llFloor grundsätzlich ab, und wenn ich nur mit der Listenlänge arbeite, würde der letzte Eintrag nie aufgerufen werden, wenn ich aber mit Listenlänge +1 rechne, wird irgendwann mal auch auf den letzten Eintrag der Liste abgerundet.

Okay, soviel Betrachtung vom Trockendock aus... probieren sollen es die Anwender ;-))
(Nein, ich sag nichts zu dem "Modus = 1;" im dataserver-Event... der Gewinn an Lesbarkeit hebt jeden "Nachteil" der Zuweisung m.E. bei weitem auf)
Vielen Dank für deine Kritik, sehr Produktiv. :)

MfG
Hannibal

PS: Ich übernehme deine Vorschläge erst bei der nächsten Version, die ich hier veröffentlichen werde. Öhm, sofern mir noch weitere Verbesserungen einfallen, aber ich denke das wird schon. :)
 
Verflucht.
Und ich hatte SL grade zugemacht... nun musste ich aber sehen, ob ich mich irre.

Testaufbau:
Code:
default
{
    touch_start(integer theNumber) {
		if (llDetectedKey(0) == llGetOwner()) {
			integer	theTries = 1000;
			list	theList = [ "a", "b", "c" ];

			integer	iLength = llGetListLength(theList);
			integer	iTries = theTries;
			list	theResults = [ "a", 0, "b", 0, "c", 0];
			integer	iUnbekannt = 0;
			string	sErg;
			integer	iPos;
			integer	iBisherig;
			while (iTries--) {
				sErg = llList2String(theList, llFloor( llFrand( (float)iLength + 1.0 ) ) );
				iPos = llListFindList(theResults, [ sErg ]);
				if (iPos >= 0 ) {
					iBisherig = llList2Integer(theResults, ++iPos);
					theResults = llListReplaceList( theResults, [ ++iBisherig ], iPos, iPos);
				} else {
					++iUnbekannt;
				}
			}
			llSay(0, "Bei +1: " + llDumpList2String(theResults, ", ")+"; unbek: "+(string)iUnbekannt);
			theResults = [ "a", 0, "b", 0, "c", 0];
			iUnbekannt = 0;
			iTries = theTries;
			while (iTries--) {
				sErg = llList2String(theList, llFloor( llFrand( (float)iLength ) ) );
				iPos = llListFindList(theResults, [ sErg ]);
				if (iPos >= 0 ) {
					iBisherig = llList2Integer(theResults, ++iPos);
					theResults = llListReplaceList( theResults, [ ++iBisherig ], iPos, iPos);
				} else {
					++iUnbekannt;
				}
			}
			llSay(0, "Ohne +1: " + llDumpList2String(theResults, ", ")+"; unbek: "+(string)iUnbekannt);
		}
    } // end touch_start


} // end default
Ergebnis:
[14:47] Object: Bei +1: a, 263, b, 237, c, 245; unbek: 255
[14:47] Object: Ohne +1: a, 340, b, 315, c, 345; unbek: 0

"unbek" heisst llList2String(theList, zufallszahl) ergibt einen Wert ungleich a, b, c - also "", weil der Index nicht ind er Liste anzufinden ist.
Nein, das Ding ist nicht schnell... nicht schön... aber es funktioniert...

(Nochmal: Bei der Auswahl aus den zeilen verwendest du die selbe Logik, die ich auch für die Liste anwende, ohne irgendwelche Zweifel... auch da geht die Spanne von 0 .. (Anzahl - 1), einmal bei Listeneinträgen, einmal bei Zeilen

[Ergänzung im Edit]Du zählst ja Listen (und Zeilen) von 0 an... nicht 1, wobei Du zur "Länge" der Liste/Zeilenanzahl kommst)
 

Users who are viewing this thread

Zurück
Oben Unten