Welcome to the LimeSurvey Community Forum

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

Zufallsauswahl basierend auf Mehrfachauswahl | gewählte Marken per Zufall

More
9 hours 7 minutes ago - 8 hours 55 minutes ago #269435 by jayat
Bitte helfen Sie uns, Ihnen zu helfen und füllen Sie folgende Felder aus:
Ihre LimeSurvey-Version:   LimeSurvey Cloud       Version 6.10.5
Eigener Server oder LimeSurvey-Cloud: LimeSurvey Cloud
Genutzte Designvorlage: eigenes Design in Fruity
==================
Liebes Forum,
mir fehlt bei meinem Vorhaben der letzte Lösungsschritt, bitte um Unterstützung, es geht um folgendes:

In der Umfrage wird in einer Mehrfachantwort zunächst geprüft, welche Marken bekannt sind, insgesamt gibt es 8 Marken.
Es kann daher min. 1 Marke bekannt sein und max. 8 Marken.

Ich möchte in der weiteren Umfrage aber aus Zeitgründen nicht immer alle bekannten Marken -maximum 8- einblenden sondern nur maximal 5. Das bedeutet folgendes:
- wenn minimal 1 Marke bekannt und maximal 5 Marken bekannt -> Liste einblenden
- wenn minimal 1 Marke bekannt und maximal mehr als 5 Marken bekannt -> Liste auf 5 Marken reduzieren

Ich möchte aber sicherstellen, dass das Set bei mehr als 5 bekannten Marken zufällig zusammengesetzt wird, damit es nicht zu einer "bevorzugten" Markenliste kommt. Jedoch soll, Marke 1, Variable F11_1 (wenn bekannt) immer im Set eingeblendet werden.

Ich habe dazu folgende Gleichungsvariablen erstellt:

eqString:

eqString = trim(join(if(F11_1 == "Y", "1,", ""), if(F11_2 == "Y", "2,", ""), if(F11_3 == "Y", "3,", ""), if(F11_4 == "Y", "4,", ""), if(F11_5 == "Y", "5,", ""), if(F11_6 == "Y", "6,", ""), if(F11_7 == "Y", "7,", ""), if(F11_8 == "Y", "8,", "")), ",")

eqSum:
count(F11_1.NAOK, F11_2.NAOK, F11_3.NAOK, F11_4.NAOK, F11_5.NAOK, F11_6.NAOK, F11_7.NAOK, F11_8.NAOK)

eqRand:
eqRand = if(is_empty(eqRand), rand(1, eqSum), eqRand)

eqFilteredList:
eqFilteredList = if(eqSum <= 5, trim(eqString, ","), if(strpos(eqString, "1") > - 1, trim("1," + substr(eqString, 4,8 ), ","), trim(substr(eqString, 1, 10), ",")))

eqAuswahlCode:
eqAuswahlCode = substr(eqString, ((eqRand - 1) * 2), 1)

eqAuswahlName:
eqAuswahlName = if(eqAuswahlCode == "1", F11_1.question, if(eqAuswahlCode == "2", F11_2.question, if(eqAuswahlCode == "3", F11_3.question, if(eqAuswahlCode == "4", F11_4.question, if(eqAuswahlCode == "5", F11_5.question, if(eqAuswahlCode == "6", F11_6.question, if(eqAuswahlCode == "7", F11_7.question, if(eqAuswahlCode == "8", F11_8.question, ""))))))))

**************************************************************************
Die Syntaxen und Gleichungen funktionieren soweit alle. Was noch nicht funktioniert ist die zufällige Auswahl von 5 Marken. eqFilteredList generiert mir bei 8 bekannten Marken immer das gleiche Marken-Set. Wie muss ich bitte die Syntax erweitern, damit die Marken im Set durchmischt werden unter der Prämisse, wenn F11_1 bekannt ist, diese Marke im Set mitberücksichtigt wird, also in dem Fall eine Fixmarke und 4 weitere bekannte per Zufall ausgewählt werden?
Ich hänge auch zur Sicherheit den lss-export an.

Besten Dank für die Hilfe!

File Attachment:

File Name: limesurvey...24-2.lss
File Size:49 KB
Last edit: 8 hours 55 minutes ago by jayat.

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
1 hour 29 minutes ago - 50 minutes ago #269436 by Joffm
Hallo,
das Ganze ist doch genau in meinem "Tutorial 4: Gleichungen, Zufall" beschrieben.
Kap. 3.3.1. und schematisch dargestellt auf Seite 19, Kap. 3.2.2.
Tutorial findest Du hier im deutschen Teil so auf Seite 18+-

Was natürlich als Erstes auffällt, ist, dass Du nur eine einzige Zufallszahl generierst, aber bis zu 5 zufälligen Marken anzeigen.
Und einige Deiner Gleichungen sind mir etwas unklar, da sie offensichtlich für die Lösung unnötig sind.
Grundsätzlich, dass Du innerhalb der Gleichungen eine unnötige Zuweisung benutzt.

Dann die Gleichung "eqFilteredList"
{if(eqSum <= 5, trim(eqString, ","), if(strpos(eqString, "1") > - 1, trim("1," + substr(eqString, 4,8 ), ","), trim(substr(eqString, 1, 10), ",")))}
Wozu dient sie?
Aber wie ich es sehe, wird diese Variable gar nicht verwendet.

Zu guter Letzt ist mir das Herumfuhrwerken mit den Kommata unklar.
In Deinem Ausgangsstring müssen doch gar keine Kommata enthalten sein. Was ist der tiefere Sinn?

Was Du letztendlich zu tun hast:
Schau nach, ob die Teilfrage 1 ausgewählt wurde.
Erzeuge eqString1 der übrigen ausgewählten Teilfragen (wie oben, ohne Komma), wie 234578
Erzeuge eine Zufallszahl von 1 - Länge des Strings
Speichere die an dieser Stelle befindliche Ziffer (eqZahl1)
Entferne sie aus dem String und Du erhältst eqString2
Erzeuge eine Zufallszahl von 1 - Länge des Strings
Speichere die an dieser Stelle befindliche Ziffer (eqZahl2)
Entferne sie aus dem String und Du erhältst eqString3
...
analog zum Schema im Tutorial

Bis Du 5 Zahlen hast.
Wenn jetzt die erste Teilfrage ausgewählt wurde, machst Du (eqFinal) ein {join('#',"1",eqZahl1,eqZahl2,eqZahl3,eqZahl4)}
wenn nicht, {join('#',eqZahl1,eqZahl2,eqZahl3,eqZahl4,eqZahl5)}

und kannst bequem anzeigen über Bedingungen
strpos(eqFinal,"1")>0
strpos(eqFinal,"2")>0
...

Joffm




 

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 50 minutes ago by Joffm.

Please Log in to join the conversation.

Moderators: holchJoffmtpartner

Lime-years ahead

Online-surveys for every purse and purpose