0 votes
in SoSci Survey (dt.) by s070898 (135 points)

Ich möchte eine Serie von 9 Seiten-Blöcken rotiert präsentieren. Jeder der 9 Blöcke besteht aus 3 zueinandergehörenden Seiten. Von den 9 Blöcken sind jeweils 3 nochmal einer Kategorie zugeteilt.
Es gibt also drei Kategorien (1,2,3), jeder Kategorie gehören drei Blöcke an (1A, 1B, 1C, 2A, ...), wobei jeder Block nochmal aus drei Seiten besteht.

Jetzt möchte ich gerne die 9 Blöcke in zufälliger Reihenfolge präsentieren. Dabei sollen aber nie alle drei Blöcke einer Kategorie hintereinander erscheinen. Meine bisherige Lösung für das zufällige Präsentieren lautet:

if (!isset($rotation)) {
	$rotation = array('A1-A3', 'B1-B3', 'C1-C3', 'D1-D3', 'E1-E3', 'F1-F3', 'G1-G3', 'H1-H3', 'I1-I3');
	shuffle($rotation);
	$rotation[] = 'T1';
	registerVariable($rotation);
 }
setPageOrder($rotation);

'A1-A3', 'B1-B3', etc. sind dabei die Blöcke (Block A, Block B, ...). A-C gehören zu Kategorie 1, D-E zu Kategorie 2, etc.
Das Problem ist, dass durch diese Lösung immernoch ab und an alle drei Blöcke einer Kategorie nacheinander erscheinen.Wie kann ich das Umgehen? Leider sind mir auch nach wiederholtem Lesen des Manuals dazu keine Ideen gekommen.

Ich hoffe Sie können da weiterhelfen.

Herzliche Grüße

1 Answer

0 votes
by SoSci Survey (302k points)

Dabei sollen aber nie alle drei Blöcke einer Kategorie hintereinander erscheinen.

Aber zwei wären okay?

ab und an alle drei Blöcke einer Kategorie nacheinander erscheinen.Wie kann ich das Umgehen?

Um das zu erreichen, müssen Sie eine sog. Schleife (do ... while) um die Zufallsziehung herum ziehen. Am Ende der Schleife kontrollieren Sie, ob die Bedingung erfüllt ist - und wenn nicht, wird neu gemischt. Immer wieder, solange bis die Abfolge gültig ist.

Die Alternative besteht darin, dass Sie eine Liste aller gültigen Abfolgen erstellen (das könnten aber recht viele sein) und diese (oder besser: eine systematische Auswahl daraus) in einem Zufallsgenerator hinterlegen.

by s070898 (135 points)
Vielen Dank für die schnelle Antwort!
Die Idee mit der Schleife finde ich gut. Zwei Blöcke einer Kategorie hintereinander wären noch okay.
Ich habe eine ähnliche Frage zu dem Thema gefunden mit einem vermutlich hilfreichen Code:
https://support.soscisurvey.de/?qa=17729/schleife-einbauen-die-bestimmte-seitenabfolge-verhindert

Ich weiß nur nicht, wie ich meine Bedingung formulieren sollte. Das betrifft diesen Teil des Codes:

$lastOne = -1;
  $double = false;
  foreach ($seiten as $seite) {
    if ($kuenstler[$seite] == $lastOne) {
      $double = true;
    }
    $lastOne = $kuenstler[$seite];
  }

Können Sie mir hilfreiche Funktionen bzw. Variablen dafür nennen?
by SoSci Survey (302k points)
edited by SoSci Survey
Das geht schon in die richtige Richtung. Allerdings brauchen Sie erstmal eine Array-Struktur, die Ihre Gruppen-Zuordnung spiegelt.

Versuchen Sie einmal folgendes zu Beginn:

$groups = [
    'A1-A3' => 1,
    'B1-B3' => 1,
    'C1-C3' => 1,
    'D1-D3' => 2,
    // u.s.w.
];

Daraus lässt sich dann auch einfach die Variable mit den Blöcken erstellen:

$blocks = array_keys($groups);

und das mischen dann etwa so:

do {
  shuffle($blocks);
  $count = 0;
  $lastGroup = -1;
  $double = false;
  foreach ($blocks as $block) {
    $group = $groups[$block];  // Da holen wir die Gruppe wieder
    if ($group == $lastGroup) {
      $count++;
      if ($count > 1) {
        $double = true;
        break;
      }
    } else {
      $count = 0;
      $lastGroup = $group;
    }
  }
} while ($double);
by s070898 (135 points)
Vielen herzlichen Dank! Das ist sehr hilfreich!

Was tut die Variable $double hier? ich habe dazu nichts gefunden. Das System zeigt mir auch eine Fehlermeldung, dasss diese Variable vorher nicht definiert wurde.
by SoSci Survey (302k points)
Setzen Sie unter das

$lastGroup = -1;

noch ein

$double = false;

Die Variable wird gesetzt, wenn die Konstellation mit 3 Blöcken aus derselben Gruppe in Folge auftritt. In dem Fall läuft die Schleife dann nochmal.
by s070898 (135 points)
Meinen herzlichsten Dank für Ihre äußerst schnelle und nützliche Hilfe! Alles funktioniert bestens.

Das ist wirklich ein guter Service!

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

...