0 votes
in SoSci Survey (dt.) by s216561 (130 points)
edited by SoSci Survey

Für meine Studie habe ich 20 Seiten erstellt, die randomisiert präsentiert werden sollen. Nun habe ich das Problem, dass sich manche Inhalte so sehr ähneln, so dass sie nicht aufeinander folgen sollen. Hierfür habe ich folgenden Code benutzt. Leider werden die Seiten trotzdem teilweise nacheinander angezeigt. Könnte mir jemand sagen, wo der Fehler liegt?

question('H113');  // Zettel in zufälliger Reihenfolge ziehen
$seiten = valueList('H113', NULL, 'label');  // Gezogene Zettel auslesen
setPageOrder($seiten, 'N');  // Seiten als Seitenabfolge definieren

$forbidden = array(
  array(04, 05),
  array(06, 07),
  array(08, 09),
  array(10, 11),
  array(12, 13),
  array(14, 15),
  array(16, 17),
  array(18, 19),

);

foreach ($forbidden as $com) {
  // Prüfen, ob die Elemente aus $com nacheinader stehen
  $n = count($com);
  $found = 0;
  for ($i=0; $i<count($seiten) - $n + 1; $i++) {
    $subset = array_slice($seiten, $i, $n);
    // Prüfen, ob in einem konsekutiven Tupel/Triple innerhalb von $Seiten
    // min. zwei der gerade geprüften Werte vorkommen
    $together = array_intersect($com, $subset);
    if (count($together) > 1) {
      $fail = true;
      break(2);
    }
  }
}

1 Answer

0 votes
by SoSci Survey (328k points)

Nun, es scheint so, dass der Code eine Variable $fail auf true setzt, wenn ein Problem vorliegt. Aber mit dieser Information passiert danach nichts. Eine mögliche Reaktion wäre, dass Sie das erste Element des gefundenen Pärchens an eine zufällige Stelle tauschen und den Code dann nochmal laufen lassen. Dafür sollten Sie ihn in eine Funktion packen.

Eine alternative Lösung bestünde darin, dass Sie eine ausreichende Zahl erlaubter Kombinationen in einem Excel-Sheet erstellen und dieses dann als komplette (Komma-separtierte) Kombinationen in den Zufallsgenerator legen.

by s216561 (130 points)
edited by s216561
Vielen Dank für die schnelle Antwort! Ich habe den Code wie folgt verändert und er scheint zu funktionieren:
question('H113');  // Zettel in zufälliger Reihenfolge ziehen
$seiten = valueList('H113', NULL, 'label');  // Gezogene Zettel auslesen

$forbidden = array(
  array(04, 05),
  array(06, 07),
  array(08, 09),
  array(10, 11),
  array(12, 13),
  array(14, 15),
  array(16, 17),
  array(18, 19),

);

{
foreach ($forbidden as $com) {
  // Prüfen, ob die Elemente aus $com nacheinader stehen
  $n = count($com);
  $found = 0;
  for ($i=0; $i<count($seiten) - $n + 1; $i++) {
    $subset = array_slice($seiten, $i, $n);
    // Prüfen, ob in einem konsekutiven Tupel/Triple innerhalb von $Seiten
    // min. zwei der gerade geprüften Werte vorkommen
    $together = array_intersect($com, $subset);
if(count($together) == 0)
   {
   setPageOrder($seiten, 'N');  // Seiten als Seitenabfolge definieren;
   }
else
    {
      shuffle ($fail = true);

      break(2);
    }
}
}
}

Ist es richtig, dass die Seiten nun solange randomisiert werden, bis keins der Pärchen mehr nebeneinander steht?
by SoSci Survey (328k points)
Ich sehe nicht, dass das shuffle() in diesem Code irgend einen Einfluss auf $seiten hätte.

Auch sehe keine Schleife, welche die Prüfung wiederholen würde, wenn die Prüfung negativ ausfüllt.

Also nein, der Code wird nicht das gewünschte Ergebnis liefern.
by s216561 (130 points)
edited by s216561
Wie könnte ich denn so eine Schleife in den Code einbauen? Ich habe es nun so versucht, es werden aber dennoch die Seiten hintereinander angezeigt.

question('H113');  // Zettel in zufälliger Reihenfolge ziehen
$seiten = valueList('H113', NULL, 'label');  // Gezogene Zettel auslesen

$forbidden = array(
  array(04, 05),
  array(06, 07),
  array(08, 09),
  array(10, 11),
  array(12, 13),
  array(14, 15),
  array(16, 17),
  array(18, 19),

);

{
foreach ($forbidden as $com) {
  // Prüfen, ob die Elemente aus $com nacheinader stehen
  $n = count($com);
  $found = 0;
  for ($i=0; $i<count($seiten) - $n + 1; $i++) {
    $subset = array_slice($seiten, $i, $n);
    // Prüfen, ob in einem konsekutiven Tupel/Triple innerhalb von $Seiten
    // min. zwei der gerade geprüften Werte vorkommen
    $together = array_intersect($com, $subset);

if (count($together) == 0)
   {
   setPageOrder($seiten, 'N');  // Seiten als Seitenabfolge definieren;
   }
 else {
    while (count($together )> 0) {
        question('H113');  // Zettel in zufälliger Reihenfolge ziehen
        $seiten = valueList('H113', NULL, 'label');  // Gezogene Zettel auslesen
    }
}
}
}
}
by SoSci Survey (328k points)
Das ist von der Programmierung her schlicht und ergreifend ein wenig komplizierter. In 14 Tagen habe ich wieder die Kapazität, um da in die Details zu gehen. Abstrakt beschrieben: Sie würden eine WHILE-Schleife verwenden, innerhalb dieser würden Sie die Gültigkeitsprüfung durchführen, und falls eine verbotene Kombination auftaucht, würden Sie eines der Elemente an eine andere Stelle tauschen und die Schleife wiederholt dann die Prüfung, solange bis keine ungültige Kombination mehr auftaucht.

Wenn Sie eine schnelle Lösung benötigen und sich nicht selbst in die Programmierung einarbeiten möchten, dann erstellen Sie bitte in Excel or R eine Liste möglicher (erlaubter) Kombinationen und hinterlegen Sie diese (als Listen) im Zufallsgenerator.

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...