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
11 hours 59 minutes ago - 11 hours 48 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: 11 hours 48 minutes ago by jayat.

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
4 hours 22 minutes ago - 3 hours 42 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: 3 hours 42 minutes ago by Joffm.

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
33 minutes ago #269448 by Joffm
So, hier jetzt mein Vorschlag.

Vielleicht hast Du im Forum bereits gelesen, dass ich bei solchen Berechnungen gerne einen "Container" anlege, der Zwischenergebnisse speichert.
Außerdem können dann alle Berechnungen in einer einzigen Gleichungsfrage stehen (hier dann wirklich mit Zuweisung)
Dieser ist eine simple "mehrfache kurze Texte" Frage
 
Gespeichert werden hier - abgesehen von der ersten Zeile, die speichert ob "F1_1" gewählt wurde, folgende Werte
Base1, Base2, Base3,... Hier steht der anfänglich generierte String, vermindert um die bereits ausgewählten Marken
Rand1, Rand2, Rand3,... Die Zufallszahl zwischen 1 und der aktuellen Stringlänge
Zahl1, Zahl2, Zahl3,... Die Ziffer die im String an der Position der Zufallszahl steht.
Am Ende werden dann je nach Wert in C_01 diese Werte gejoint; entweder bis zu 5, oder "1" und bis zu 4.
Code:
{C_01=if(F1_1=="Y","1","")}
 
{C_11=join(if(F1_2=="Y","2",""),if(F1_3=="Y","3",""),if(F1_4=="Y","4",""),if(F1_5=="Y","5",""),if(F1_6=="Y","6",""),if(F1_7=="Y","7",""),if(F1_8=="Y","8",""))}{C_12=if(is_empty(C_12),rand(1,strlen(C_11)),C_12)}
{C_13=substr(C_11,(C_12-1),1)}
{C_21=str_replace(C_13,"",C_11)}
{C_22=if(is_empty(C_22),rand(1,strlen(C_21)),C_22)}
{C_23=substr(C_21,(C_22-1),1)}
{C_31=str_replace(C_23,"",C_21)}
{C_32=if(is_empty(C_32),rand(1,strlen(C_31)),C_32)}
{C_33=substr(C_31,(C_32-1),1)}
{C_41=str_replace(C_33,"",C_31)}
{C_42=if(is_empty(C_42),rand(1,strlen(C_41)),C_42)}
{C_43=substr(C_41,(C_42-1),1)}
{C_51=str_replace(C_43,"",C_41)}
{C_52=if(is_empty(C_52),rand(1,strlen(C_51)),C_52)}
{C_53=substr(C_51,(C_52-1),1)}
 
{C_99=if(C_01==1,join("#","1",C_13,C_23,C_33,C_43),join("#",C_13,C_23,C_33,C_43,C_53))}
Wie Du siehst, wird fünfmal die gleiche Prozedur wiederholt.

Und so etwas enthält der "Container"
 

Zum Schluss sind einfach die bis zu 5 ausgewählten Marken aufgelistet
Damit kannst Du dann ja "spielen", wie gewünscht.
 

File Attachment:

File Name: limesurvey...99_J.lss
File Size:58 KB


Joffm

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

Please Log in to join the conversation.

Moderators: holchJoffmtpartner

Lime-years ahead

Online-surveys for every purse and purpose