Aufbauend auf diesem Thread
[url]
forums.limesurvey.org/forum/german-forum...satzbedingung#227422
[/url]
möchte ich hier zeigen, wie man die "Urnenziehung" viel einfacher mit javascript bewerkstelligen kann.
Falls LimeSurvey bei der LimeSurvey GmbH gehostet ist, sind ja ebenfalls kein plugins zu installieren; javascript ist hier aber kein Problem.
Das Szenario ist dasselbe.
Aber um die 5 Zufallszahlen zu erhalten, benutzen wir hier eine Frage vom Typ "mehrfache kurze Texte" mit 5 Teilfragen.
Im Quellcode dieser Frage tragen wir ein
Code:
<script type="text/javascript" charset="utf-8">
function shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
$(document).on('ready pjax:scriptcomplete',function(){
// Fill the array
const dreiMal = [];
var arr = [];
for (var i = 1; i < 701; i++) {
if (!dreiMal.includes(i)) {
arr.push(i);
}
}
arr = shuffle(arr);
$('#question{QID} input[type="text"]:eq(0)').val(arr[0]);
$('#question{QID} input[type="text"]:eq(1)').val(arr[1]);
$('#question{QID} input[type="text"]:eq(2)').val(arr[2]);
$('#question{QID} input[type="text"]:eq(3)').val(arr[3]);
$('#question{QID} input[type="text"]:eq(4)').val(arr[4]);
$('#question{QID}').hide();
});
</script>
Was passiert hier?
Es sind zwei Arrays definiert.
1. Das array "dreiMal". Dieses wird später die Codes der Satzpaare enthalten, welche bereits drei Mal erschienen sind.
2. Das eigentlich array, welches alle Codes enthält, die
nicht im Array "dreiMal" enthalten sind.
Diese Array wird nun gründlich durchgeschüttelt ("shuffle"), und die ersten 5 Elemente werden in die 5 Teilfragen eingetragen.
Damit haben wir schon unsere fünf Zufallszahlen.
Das war schon ein ganzes Stück kürzer als nur mit Gleichungen.
Der Rest bleibt gleich, mit dem kleinen Unterschied, dass nun nicht einzelne Fragen "eqZahl1", eqZahl2", ... benutzt werden, sondern direkt die Teilfragen "QWert_1", "QWert_2",...
Es werden wieder die Container und die Stelle im Container bestimmt, und der Text entsprechend abgerufen.
Auch hier darauf achten:
Beim Hineinkopieren der Texte von EXCEL oder einem Texteditor werden zwei Zeichen als Zeilenumbruch benutzt; wenn die Umfrage kopiert oder importiert wurde, nur eines.
(Dies liegt an den unterschiedlichen Betriebssystemen)
Daher den Wert "252" in "251" ändern.
Ich gehe aber davon aus, dass dieser Wert ja je nach Szenario gesetzt wird.
Wie geht man nun vor, um Satzpaare, die bereits dreimal angezeigt wurden, nicht mehr auszuwählen?
Hier habe ich mir ein etwas anderes Procedere vorgestellt.
Oben wurde ja das Array "dreimal" gezeigt. Hier werden also die Codes eingetragen, die bereits dreimal gekommen sind.
Dazu muss nur das EXCEL-Makro etwas geändert werden.
Zum Beispiel:
Sub Pool()
Dim i, arow, acol, s, A() As Integer, erg, erg2
' Dimensioniere das array auf die Gesamtanzahl der Paare
' Hier als Beispiel 700
ReDim A(700)
' Vorbesetze alle Zellen mit 0
For i = 1 To 700
A(i) = 0
Next
' Gehe durch die Daten und zähle das array entsprechend hoch
arow = 2
s = Cells(arow, 2)
While s <> ""
For acol = 0 To 4
s = Cells(arow, 2 + acol)
s = Int(s)
A(s) = A(s) + 1
Next
arow = arow + 1
s = Cells(arow, 2)
Wend
' Initialisiere den Ergebnisstring
erg2 = "const dreiMal = ["
' Schreibe den Ergebnisstring
' Falls der Wert >2 füge zum String hinzu
For arow = 1 To 700
If A(arow) > 2 Then
erg2 = erg2 & arow & ", "
End If
Next
Cells(1, 7) = Mid$(erg2, 1, Len(erg2) - 2) & "];"
End Sub
Dann kann man dies erhalten:
Und genau mit diesem Text "const dreiMal=[...];" ersetzt man die entsprechende Zeile im script.
Joffm
In diesem Beispiel wurde die Umfrage bereits einmal exportiert und importiert. Daher sind hier die Werte schon auf "251" geändert.