Welcome to the LimeSurvey Community Forum

Ask the community, share ideas, and connect with other LimeSurvey users!

Urnenziehung ohne Zurücklegen (mit javascript, ohne plugin) mit Zusatzbedingung

  • Joffm
  • Joffm's Avatar Topic Author
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 years 2 weeks ago #227426 by Joffm
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.
 

File Attachment:

File Name: limesurvey...2826.lss
File Size:231 KB


 

Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

Moderators: Joffm

Lime-years ahead

Online-surveys for every purse and purpose