====== Randomisierung ======

Möchte man einen Teilnehmer zufällig einer Experimentalgruppe zuweisen (Zufallsauswahl), so handelt es sich um eine Randomisierung.

Von der Randomisierung zu unterscheiden ist die [[rotation|Rotation]] -- dabei wird die Reihenfolge von Items oder Fragen variiert, um Reihenstellungseffekten zu begegnen.

**Tipp:** Lesen Sie zum Verständnis der komplexeren Code-Beispiele (unten) die Kapitel [[php|Einführung in PHP-Code]] und [[array|Einführung in Arrays]].


===== Grundsätzliche Verwendung =====

Die experimentelle Logik (between-subject) geht davon aus, dass die Teilnehmer eines Experiments in unterschiedliche Experimentalgruppen eingeteilt werden. Abhängig von der zugewiesenen Gruppe wird dann eine Frage, ein Text, Bild oder Video variiert (das Treatment bzw. der Stimulus).

Auch wenn Ihr Ziel "nur" darin besteht, dass zum Beispiel die eine Hälfte der Teilnehmer Frage A beantworten soll und die andere Hälfte der Teilnehmer Frage B: Denken Sie bitte daran, dass konzeptionell eine Einteilung in Experimentalgruppen erfolgt.


==== Schritt 1: Einteilung in Experimentalgruppen ====

Legen Sie eine Frage vom Typ [[:de:create:questions:random]] an. In das Feld //Zettel (Inhalte)// schreiben Sie eine kurze Beschreibung Ihrer Experimentalgruppen, z.B.

<code>
Kontrollgruppe
Positive Fallbeispiele
Negative Fallbeispiele
</code>

Nach dem Speichern ergänzt SoSci Survey für jede Gruppe einen numerischen Code, z.B.

<code>
1 = Kontrollgruppe
2 = Positive Fallbeispiele
3 = Negative Fallbeispiele
</code>

Bei der //Art der Ziehung// können Sie in Betracht ziehen, ob Sie statt "Gleichverteilte Ziehung" vielleicht die "Gleichverteilung in abgeschlossenen Fragebögen" auswählen möchten. Dies kann sinnvoll sein, wenn Sie in einer Experimentalgruppe mit systematisch mehr Abbrechern rechnen.

Für //Anzahl Zettel pro Interview// lassen Sie den Wert 1 stehen. So wird der Teilnehmer nur einer der Experimentalbedingungen/-gruppen zugeteilt. Die Ziehung mehrerer Zettel ist für bestimmte within-subject Designs sinnvoll.


==== Schritt 2: Präsentation des Stimulus ====

Beim **Fragebogen zusammenstellen** ziehen Sie die Zufallsgenerator-Frage, die Sie oben angelegt haben, auf jene Seite im Fragebogen, wo die Zuweisung des Teilnehmers zu einer Experimentalgruppe erfolgen soll. In aller Regel ist das die Seite, wo der Stimulus präsentiert wird.

Der Zufallsgenerator zieht nun zufällig einen der definierten Zettel und speichert dessen Code in einer Variable mit der Kennung des Zufallsgenerators. Wenn die Zufallsgenerator-Frage also z.B. die Kennung "RG01" hat, würde die gezogene Zahl im Datensatz als Variable "RG01" gespeichert werden. Im obigen Beispiel würde also der Code 1, 2 oder 3 gespeichert.

An der Stelle, wo der Stimulus erscheinen soll (auf jeden Fall unter der Zufallsgenerator-Frage oder auf einer späteren Seite) platzieren Sie nun ein Element "PHP-Code" ([[:de:create:php]]). Hier benötigen Sie nun den PHP-Code für einen [[:de:create:filters|Filter]], der je nach zugeteilter Experimentalgruppe (=gezogene Zufallszahl) den passenden Stimulus anzeigt.

Ist der Stimulus eine Frage (d.h. in Gruppe A soll eine andere Frage aus dem **Fragenkatalog**angezeigt werden als in Gruppe B), so kommt die Funktion ''[[:de:create:functions:question]]'' zum Einsatz. Für Texte, Bilder und Videos verwendet man die Funktion ''[[:de:create:functions:text]]'', welche den HTML-Code zur Anzeige des entsprechenden Stimulus aus einem Textbaustein einbindet. Mehr dazu unten und unter [[:de:create:images]] und [[:de:create:media]].

Der folgende PHP-Code würde in der Gruppe "Positive Fallbeispiele" die Frage "AB01" anzeigen, in der Gruppe "Negative Fallbeispiele" die Frage "AB02" und in der Kontrollgruppe gar nichts.

<code php>
if (value('RG01') == 2) {
  question('AB01');
} elseif (value('RG01') == 3) {
  question('AB02');
} else {
  // Den else-Teil könnte man in diesem Fall weglassen,
  // hier passiert rein gar nichts.
}
</code>

Die Funktion ''[[:de:create:functions:value]]'' ist dafür zuständig, die gezogene Zufallszahl aus der Variable "RG01" (diese Kennung muss ggf. durch die Kennung des Zufallsgenerators ersetzt werden!) auszulesen und im PHP-Code für den Filter zur Verfügung zu stellen.

Die weiteren Abschnitte in dieser Anleitung erklären unterschiedliche Einsatzbereiche der Randomisierung.


===== Ziehung einer Zufallszahl =====

Das Kernstück jeder Randomisierung ist das Zufallsereignis -- die Ziehung einer Zufallszahl. Generell gibt es bei der zufälligen Auswahl (eines Stimulus, einer Frage, einer Abfolge, etc.) zwei Möglichkeiten: Die Ziehung "mit" oder "ohne" Zurücklegen.

Nachdem eine Zufallszahl erst einmal gezogen wurde, ist die weitere Anwendung unabhängig vom "mit" oder "ohne". Die Zufallszahl wird mittels ''[[:de:create:functions:value|value()]]'' aus dem Datensatz ausgelesen und z.B. in einem Filter verwendet.

  * Die beste Lösung zur Ziehung einer Zufallszahl ist i.d.R. eine Funktionsfrage vom Typ [[:de:create:questions:random]]. Im Kapitel zum Fragetyp finden Sie weitere Beispiele zur Randomisierung.
  * Eine Alternative zum Zufallsgenerator ist die [[:de:create:random_urns|Randomisierung mit Urnen]]. Diese können Kombinationen mehrerer Werte ziehen und eignen sich deshalb besonders für mehrfaktorielle Experimente und Conjoint Analysen.
  * In ganz seltenen Fällen sind die verschiedenen Varianten des Fragebogens so unterschiedlich, dass Filter zu aufwändig werden. Für diese Fälle kann man die Teilnehmer zufällig zu unterschiedlichen Fragebögen zulosen ([[random_questionnaire|Zufallsauswahl für Fragebögen]]). Bei der zufälligen Auswahl eines Fragebogens kommt stets eine Ziehung mit Zurücklegen zum Einsatz -- die resultierenden Gruppengrößen können also deutlich variieren.

**Tipp:** Der Abruf der Zufallszahl mittels ''value()'' ist auf derselben Seite (unterhalb der Ziehung bzw. dem Zufallsgenerator) und/oder auf jeder späteren Seite im Fragebogen möglich. So kann ein Stimulus auf mehrere Seiten verteilt werden, oder es können die Stimuli unterschiedlicher Experimentalfaktoren auf unterschiedlichen Seiten dargeboten werden.


===== Stimulus randomisieren =====

Vor allem in Experimenten muss man die Teilnehmer häufig zufällig auf Versuchs- und Kontrollgruppe(n) verteilen. Oder anders ausgedrückt: Man muss den zufällig auswählen, welcher von mehreren Stimuli angezeigt wird.

Das folgende Beispiel zeigt, wie Sie mittels [[php|PHP-Code]] eines von 4 Bildern anzeigen. Voraussetzung ist, dass Sie -- wie oben beschrieben -- eine Zufallszahl zwischen 1 und 4 gezogen und in Variable ''RG01'' gespeichert haben. Außerdem müssen Sie die 4 Bilder vorab unter **Bilder und Mediendateien** in das Befragungsprojekt hochladen.

<code php>
$zahl = value('RG01');  // Auslesen der gezogenen Zufallszahl

// Grafik in Abhängigkeit von der Zahl anzeigen
// (dafür wird HTML-Code verwendet)
if ($zahl == 1) {
  html('<p><img src="stimulus1.png"></p>');
} elseif ($zahl == 2) {
  html('<p><img src="stimulus2.png"></p>');
} elseif ($zahl == 3) {
  html('<p><img src="stimulus3.png"></p>');
} elseif ($zahl == 4) {
  html('<p><img src="stimulus4.png"></p>');
}
</code>
   
Das Beispiel zeigt zufällig die Grafik "stimulus1.png", "stimulus2.png", "stimulus3.png" oder "stimulus4.png". Darunter könnte beispielsweise eine Frage zur Bewertung des Bildes angezeigt werden.

Anstatt mit ''html()'' Text oder eine Grafik anzuzeigen, kann man natürlich auch mit ''[[:de:create:functions:text|text()]]'' einen längeren Text zeigen, ein Video einbinden oder mit ''[[:de:create:functions:question|question()]]'' eine Frage anzeigen.

Der folgende PHP-Code zeigt genau dieselben Bilder wie der obige PHP-Code, arbeitet aber nicht mit kompletten HTML-Code-Stückchen, sondern mit einem Platzhalter ''%dateiname%'' und der Funktion ''[[:de:create:functions:replace]]''.

<code php>
$code = value('RG01');  // Auslesen der gezogenen Zufallszahl

// Grafikdatei in Abhängigkeit von der Zufallszahl in einen Platzhalter schreiben
if ($code == 1) {
  replace('%dateiname%', 'stimulus1.png');
} elseif ($code == 2) {
  replace('%dateiname%', 'stimulus2.png');
} elseif ($code == 3) {
  replace('%dateiname%', 'stimulus3.png');
} elseif ($code == 4) {
  replace('%dateiname%', 'stimulus4.png');
}
// Den HTML-Code kann man direkt einbinden oder (hier nicht gezeigt) als Textbaustein
html('<p><img src="%dateiname%"></p>');
</code>

**Tipp:** Platzhalter sind vor allem dann hilfreich, wenn für die Einbindung des Stimulus mehr HTML-Code erforderlich ist, als hier exemplarisch gezeigt.

**Tipp:** Die Bezeichnung der PHP-Variable (in den Beispielen ''$zahl'' und ''$code'') ist willkürlich gewählt. Mehr dazu s. [[https://www.soscisurvey.de/help/doku.php/de:create:variables#php-variablen|PHP-Variablen]].

Falls Ihre Stimuli umfangreichen HTML-Code erfordern (z.B. Videos), wenn sich der HTML-Code zwischen den einzelnen Experimentalgruppen stark unterscheidet oder wenn Sie mit einem [[:de:create:multilang|mehrsprachigen Fragebogen]] arbeiten, legen Sie vier Texte im Fragenkatalog an (z.B. "RG02" bis "RG05", //Darstellung// jeweils HTML-Code) und binden sie diese abhängig von der Zufallsziehung ein:

<code php>
$code = value('RG01');  // Auslesen der gezogenen Zufallszahl

// Text bzw. HTML-Code als Text anzeigen
if ($code == 1) {
  text('RG02');
} elseif ($code == 2) {
  text('RG03');
} elseif ($code == 3) {
  text('RG04');
} elseif ($code == 4) {
  text('RG05');
}
</code>


==== Bilder, Texte, Filme, HTML ====

Mehrere Code-Beispiele in diesem Kapitel beschreiben, wie man Bilder rotiert oder randomisiert anzeigt. Dabei wird jeweils ein HTML-Tag ''<img>'' eingebunden, z.B.

<code php>
$zahl = value('RG01');

// Den kompletten HTML-Code jedes Mal angeben
if ($zahl == 1) {
  html('<img src="bildA.jpg" alt="Wahlplakat Kandidat A">');
} elseif ($zahl == 2) {
  html('<img src="bildB.jpg" alt="Wahlplakat Kandidat B">');
}
</code>

<code php>
$zahl = value('RG01');

// Im Filter nur den Bildnamen ermitteln ...
if ($zahl == 1) {
  $bild = 'bildA.jpg';
} elseif ($zahl == 2) {
  $bild = 'bildB.jpg';
}
// ... und erst danach den HTML-Code erzeugen
html('<img src="'.$bild.'" alt="Wahlplakat">');
</code>

Andere Inhalte -- z.B. Filme, Stimulustexte, etc. -- können Sie ganz genauso als HTML-Code einbinden. Siehe auch [[media|Mediendateien im Fragebogen]].

Am Besten legt man die HTML-Codes zum Einbinden von Filmen, Audiodateien bzw. die Stimulustexte unter **Textbausteine und Beschriftung** als Textbausteine an ([[texts|Texte im Fragebogen]]). Diese Textbausteine kann man dann mit der Funktion ''[[:de:create:functions:text|text()]]'' einbinden. Das Äquivalent zum obigen Code-Ausschnitt würde dann wie folgt aussehen:

<code php>
$zahl = value('RG01');

if ($zahl == 1) {
  text('stimulusA');
} elseif ($zahl == 2) {
  text('stimulusB');
}
</code>

**Hinweis:** Bei den obigen Beispielen handelt es sich nur um die Ausschnitte aus dem PHP-Code, die für die Anzeige des Stimulus erforderlich sind. Zuvor muss noch eine Zufallszahl gezogen und ausgelesen werden (s. oben).

**Tipp:** In einem Textbaustein können Sie selbstverständlich auch mehrere Elemente kombinieren -- also z.B. ein Bild und daneben einen Text:

<code>
<table cellspacing="0" cellpadding="0" border="0">
<colgroup>
  <col width="400"> <!-- Breite des Bilds in Pixeln -->
  <col>
<colgroup>
<tr>
  <td><img src="bildA.jpg" alt="Wahlplakat"></td>
  <td style="padding-left: 20px">
    <p>Max Müller tritt für die Rechte der Bürger ein. Mit einem nachhaltigen Konzept und fundierten Ideen möchte er mehr Bürgerbeteiligung und effizientere Entscheidungsprozesse erreichen.
  </td>
</tr>
</table>
</code>


==== Stimulus und Frage zusammen ====

Sie benötigen für einen Teil der Stimuli eine Frage und eine andere für die restlichen Stimuli?

<code php>
$zahl = value('RG01');

if ($zahl == 1) {
  text('stimulusA');
  question('AB01');
} elseif ($zahl == 2) {
  text('stimulusB');
  question('AB01');
} elseif ($zahl == 3) {
  text('stimulusC');
  question('AB02');
} elseif ($zahl == 4) {
  text('stimulusD');
  question('AB02');
}
</code>

==== Stimulus und Frage auf unterschiedlichen Seiten ====

Falls Stimulus und (jeweils zugehörige) Frage auf unterschiedlichen Seite gezeigt werden sollen, bauen Sie auf beiden Seiten einen Filter ein. Wenn Sie die Zufallszahl einmal gezogen haben, steht sie (im Beispiel als Variable ''RG01'') auf allen folgenden Seiten zur Verfügung. Sie brauchen den Zufallsgenerator (oder die Urnen-Ziehung) also nur ein einziges Mal im Fragebogen zu platzieren, i.d.R. direkt vor dem ersten Filter.

<code php>
// PHP-Code auf der Seite mit dem Stimulus
$zahl = value('RG01');

if ($zahl == 1) {
  text('stimulusA');
} elseif ($zahl == 2) {
  text('stimulusB');
} elseif ($zahl == 3) {
  text('stimulusC');
} elseif ($zahl == 4) {
  text('stimulusD');
}
</code>

<code php>
// PHP-Code auf der Seite mit der Frage
$zahl = value('RG01');

if ($zahl == 1) {
  question('AB01');
} elseif ($zahl == 2) {
  question('AB01');
} elseif ($zahl == 3) {
  question('AB02');
} elseif ($zahl == 4) {
  question('AB02');
}
</code>

**Hinweis:** Diese Lösung ist natürlich __nicht__ erforderlich, wenn unabhängig vom Stimulus immer dieselbe Frage angezeigt wird.

**Tipp:** Mit dieser Variable können zusammengehörige Stimuli (z.B. Seite 1 bis 3 eines Zeitungsartikel) auf auf mehrere Seiten verteilt werden.

===== Randomisierung von Fragen =====

V.a. in Methodenexperimenten werden ganze Fragen randomisiert -- auch das ist mit Filtern recht einfach zu erledigen. Das Vorgehen ist im Prinzip dasselbe wie bei der Randomisierung eines Stimulus:

<code php>
$zahl = value('RG01');

if ($zahl == 1) {
  question('AB01');
} elseif ($zahl == 2) {
  question('AB02');
}
</code>

Etwas schwieriger wird es, wenn die Fragen auf unterschiedlichen Seiten im Fragebogen erscheinen sollen. In diesem Fall muss man an zwei Stellen filtern:

<code php>
$zahl = value('RG01');  // Auslesen der gezogenen Zufallszahl aus RG01

// Die eine oder die andere Frage zeigen
if ($zahl == 1) {
  question('AB01');  // Bewertung des Politikers
} else {
  question('AB02');  // Bewertung der Partei
}
</code>

<code php>
$zahl = value('RG01');
if ($zahl == 1) {
  question('AB02');  // Bewertung der Partei
} else {
  question('AB01');  // Bewertung des Politikers
}
</code>

Im Beispiel wird nun zufällig entweder zuerst Frage AB01 und dann später AB02 angezeigt -- oder genau andersherum.


===== Randomisierung von Seiten =====

Wenn die Reihenfolge komplexer variiert werden soll, können Filter -- wie im obigen Beispiel -- schnell unübersichtlich werden. In diesem Fall kann die PHP-Funktion ''[[:de:create:functions:setpageorder|setPageOrder()]]'' helfen. Mit dieser Funktion kann die Abfolge der Seiten im Fragebogen variiert werden.

<code php>
$zahl = value('RG01');  // Zufallzahl wurde von RG01 gezogen
if ($zahl == 1) {
  setPageOrder('q1','q2','mainStart-mainEnd','q3');
} elseif ($zahl == 2) {
  setPageOrder('q1','mainStart-mainEnd','q2','q3');
} else {
  setPageOrder('q2','q1','mainStart-mainEnd','q3');
}
</code>

Weitere Erklärungen und Beispiele finden Sie in der Referenz zur Funktion ''[[:de:create:functions:setpageorder|setPageOrder()]]''.


===== Zufällige Auswahl von Fragen =====

Sie möchten zufällig 3 von 10 Fragen anzeigen, um Ihren Stimulus auf mehrere Teilnehmer zu verteilen? Hier sind für Zufallsziehung mit und ohne Zurücklegen zwei unterschiedliche Lösungen möglich.


==== Auswahl mit Zurücklegen ====

Wenn es egal ist, in welchen Kombinationen die Fragen angezeigt werden __und__ wenn die Fallzahlen pro Frage hinreichend groß sind, um statistische Schwankungen zu verkraften, dann erstellen Sie eine Liste (Array) mit allen Frage-Kennungen, mischen Sie die Liste und zeigen Sie dann die Fragen zu den ersten drei Kennungen an.

<code php>
// Sicherstellen, dass beim Neu-Laden der Seite nicht neu gezogen wird
if (!isset($fragen)) {
  // Liste der relevanten Fragen
  $fragen = array(
    'AB01', 'AB02', 'AB03', 'AB04', 'AB05',
    'BB01', 'BB02', 'BB03', 'CC01', 'CC02'
  );
  // Die Liste mischen
  shuffle($fragen);
  // Und die Variable für eine erneute Anzeige der Seite speichern
  registerVariable('fragen');
}
// Die Frage anzeigen, die nach dem Mischen an erste Stelle steht
question($fragen[0]);
// Und die Fragen an zweiter und dritter Stelle
question($fragen[1]);
question($fragen[2]);
</code>

**Tipp:** Wenn die Fragen auf unterschiedlichen Seiten angezeigt werden sollen, dann platzieren Sie die Zeilen mit ''question()'' einfach auf unterschiedlichen Seiten im Fragebogen.

**Vorsicht:** Wenn Sie im Fragebogen mehrere solcher Auswahlen verwenden, dann kann die Zeile mit ''isset()'' Ärger bereiten. Verwenden Sie in diesem Fall unterschiedliche Variablen für ''$fragen'', also z.B. ''$fragen1'' und ''$fragen2'' (anzupassen natürlich auch in ''registerVariable()'').


==== Auswahl ohne Zurücklegen ====

Wenn Sie sicherstellen müssen, dass alle Fragen gleich häufig angezeigt werden, benötigen Sie eine Urne, die mögliche 3er-Kombinationen der Frage-Kennungen enthält. Diese 3er-Kombinationen müssen Sie vorab erstellen, z.B. in Excel.

<code>AB01, AB02, AB03
AB01, AB02, AB04
AB01, AB02, AB05
...
AB05, AB03, AB04
AB05, AB04, AB03
</code>

Schon bei 5 Fragen sind 60 Kombinationen möglich. Wenn Sie deutlich mehr Kombinationen als Teilnehmer haben, müssen Sie einen Teil der Kombinationen evtl. systematisch entfernen -- sonst ist nicht sichergestellt, dass die Fragen gleich häufig angezeigt werden.

Im Fragebogen ziehen Sie nun eine der Kombinationen aus der Urne und verwenden die so gezogenen Kennungen in der ''question()''-Funktion. Beachten Sie, dass Sie in diesem Fall 3 Variablen in der Frage ''IV01'' vom Typ "interene Variablen" benötigen.

<code php>
urnDraw('fragen', 'IV01');
question(value('IV01_01'));
question(value('IV01_02'));
question(value('IV01_03'));
</code>

Auch hier können Sie die ''question()''-Funktionen einfach auf unterschiedliche Seiten im Fragebogen verteilen.


==== Viele Stimuli ====

Womöglich möchten Sie eine größere Anzahl von Objekten bewerten lassen. Anstatt einer ''if''-Konstruktion ist die ''switch''-Konstruktion dann etwas handlicher. Die beiden folgenden Codes haben genau denselben Effekt:

<code php>
$zahl = value('RG01');  // Zufallszahl wurde vorab in RG01 gezogen
if ($zahl == 1) {
  $src = 'affe.jpg';
} elseif ($zahl == 2) {
  $src = 'brontosaurus.jpg';
} elseif ($zahl == 3) {
  $src = 'chintilla.jpg';
} elseif ($zahl == 4) {
  $src = 'dackel.jpg';
} elseif ($zahl == 5) {
  $src = 'elefant.jpg';
} elseif ($zahl == 6) {
  $src = 'frettchen.jpg';
} elseif ($zahl == 7) {
  $src = 'gepard.jpg';
} elseif ($zahl == 8) {
  $src = 'habicht.jpg';
} elseif ($zahl == 9) {
  $src = 'igel.jpg';
} elseif ($zahl == 10) {
  $src = 'jaguar.jpg';
}
html('
  <div style="margin: 30px 0px; text-align: center">
  <img src="'.$src.'" alt="Tierfoto">
  </div>
');
</code>

<code php>
switch (value('RG01')) {
  case 1 : $src = 'affe.jpg'; break;
  case 2 : $src = 'brontosaurus.jpg'; break;
  case 3 : $src = 'chintilla.jpg'; break;
  case 4 : $src = 'dackel.jpg'; break;
  case 5 : $src = 'elefant.jpg'; break;
  case 6 : $src = 'frettchen.jpg'; break;
  case 7 : $src = 'gepard.jpg'; break;
  case 8 : $src = 'habicht.jpg'; break;
  case 9 : $src = 'igel.jpg'; break;
  case 10 : $src = 'jaguar.jpg'; break;
}
html('
  <div style="margin: 30px 0px; text-align: center">
  <img src="'.$src.'" alt="Tierfoto">
  </div>
');
</code>


===== Kombinationen =====

Sie können mit einer Urne nicht nur eine Zufallszahl ziehen, sondern gleich eine ganze Kombination. Damit lassen sich mehrfaktorielle Experimente oder Conjoint-Abfragen einfach realisieren.

Dieses Beispiel verwendet 3 interne Variablen (''IV01_01'' bis ''IV01_03'', bezeichnet als "Preis", "Qualität" und "Lieferzeit") und eine Urne "kombi" mit folgendem Inhalt:

<code>
1, 1, 1
1, 1, 2
1, 2, 1
1, 2, 2
2, 1, 1
2, 1, 2
2, 2, 1
2, 2, 2
</code>

Im Beispiel wird also stets eine 3er-Kombination gezogen. Jede der drei Variablen hat entweder die Ausprägung 1 oder 2. Mittels Arrays werden den Zahlen Text zugeordnet. Dabei dient der gezogene Wert (also 1 oder 2) als Schlüssel -- er wird in eckigen Klammern angegeben, um das jeweilige Element des Arrays auszuwählen. Siehe auch [[:de:create:filter-items#arrays|Arrays]].

<code php>
urnDraw('kombi', 'IV01');
// Die Zahlen kodieren drei Eigenschaften - hier werden ihnen Text zugeordnet
$preis = array(
  1 => '5 Euro',
  2 => '10 Euro',
);
$qualitaet = array(
  1 => 'normal',
  2 => 'hochwertig'
);
$lieferzeit = array(
  1 => 'schnell',
  2 => 'langsam'
);
html('
  <h1>Bitte stellen Sie sich folgenden Obstkorb vor:</h1> 
  <p>Preis: '.$preis[value('IV01_01')].'</p>
  <p>Qualität: '.$qualitaet[value('IV01_02')].'</p>
  <p>Lieferzeit: '.$lieferzeit[value('IV01_03')].'</p>
');
</code>


===== Mehrfach aus Urnen ziehen =====

**Wichtig:** Wenn Sie innerhalb eines Interview mehrere Zettel ziehen möchten, der gleiche Zettel aber nicht mehrfach gezogen werden darf, dann verwenden Sie statt der Urne einen [[:de:create:questions:random]]. Lesen Sie dazu auch die Hinweise am Ende dieses Abschnitts.

Wenn Sie aus unterschiedlichen Urnen ziehen möchten, benötigen Sie auch mehrere Fragen vom Typ "interne Variablen" -- im Beispiel drei solche Fragen "IV01", "IV02" und "IV03".

<code php>
urnDraw('personen', 'IV01', 'end');  // Ersten Zettel ziehen aus "Personen"
urnDraw('personen', 'IV02', 'end');  // Zweiten Zettel ziehen aus "Personen"
urnDraw('beziehung','IV03', 'end');  // Dritten Zettel ziehen aus "Beziehung"
// Die Zettel werden erst abgelegt, wenn der Teilnehmer das Ende des
// Fragebogens erreicht - so werden Abbrecher bei der Ziehung nicht gezählt

// Auf den Personen-Zettel stünde nun z.B.: Alter, Vorname, Geschlecht
// Dies wird zusammengefügt als "Alter (Vorname, Geschlecht)"
$beschreibung1 = value('IV01_01').' ('.value('IV01_02').', '.value('IV01_03').')';
$beschreibung2 = value('IV02_01').' ('.value('IV02_02').', '.value('IV02_03').')';
// Jetzt in der Beschreibung also
// z.B. "Andreas (25, m)" und "Berta (22, w)"
// Steht nun noch auf dem dritten Zettel, in welcher Beziehung
// die beiden Personen stehen, lässt sich so eine Situations-
// Beschreibung erstellen:
$komplett = $beschreibung1.' '.value('IV03_01').' '.$beschreibung2;
// z.B. "Andreas (25, m) wohnt bei Berta (22, w)";
// Natürlich könnte der Text auch per Platzhalter in die Frage
// integriert werden
html($komplett);
</code>

Hier ein noch komplexeres Beispiel, das zeigt, wie man Zufallszahlen in Textelemente transformieren kann. Für das folgende Beispiel wird ein 6x4-Design angenommen -- entsprechend enthält die Urne "Award" 24 Zettel:

<code>
11, 21
11, 22
11, 23
11, 24
12, 21
12, 22
...
16, 23
16, 24</code>

<code php>
// Eine Kombination aus Urne "Award" ziehen und auf "A101" speichern,
// Zettel noch nicht ablegen
urnDraw('Award','A101','man');
// Werte sind nun gespeichert unter A101_01 und A101_02
// Der erste Wert kann 11-16 sein, der zweite 21-24
// Texte in Variable $text1 und $text2 speichern
switch (value('A101_01')) {
  case 11: $text1 = '500 Euro'; break;
  case 12: $text1 = '1000 Euro'; break;
  case 13: $text1 = '1500 Euro'; break;
  case 14: $text1 = '2000 Euro'; break;
  case 15: $text1 = '2500 Euro'; break;
  case 16: $text1 = '3000 Euro'; break;
  default: $text1 = 'Ungültiger Code: '.value('A101_01');
}
switch (value('A101_02')) {
  case 21: $text2 = 'Ein Freund'; break;
  case 22: $text2 = 'Ein Verwandter'; break;
  case 23: $text2 = 'Ein Kollege'; break;
  case 24: $text2 = 'Ihr Chef'; break;
  default: $text1 = 'Ungültiger Code: '.value('A101_02');
}
$situation = $text2.' will sich bei Ihnen '.$text1.' leihen';
// In Platzhalter %situation% speichern
replace('%situation%', $situation);
// Frage zur Situation (mit Platzhalter %situation%)
question('AL07');
</code>

Auf einer späteren Seite -- wenn alle relevanten Daten erfragt wurden -- wird der Zettel dann abgelegt:

<code php>
urnPutAway('A101');
// Oder in diesem Fall auch einfach nur
urnPutAway();
</code>

**Wichtig:** Wenn Sie aus mehreren Urnen ziehen, so ist zwar die Gleichverteilung der einzelnen Ziehungen sichergestellt -- nicht aber die Gleichverteilung der Kombinationen. Einige Kombinationen können deutlich häufiger auftreten als andere. Verwenden Sie __eine__ [[#mehrere_werten_pro_zettel|Urne mit mehreren Werten pro Zettel]], um auch die Kombinationen gleichmäßig zu verteilen.

**Wichtig:** Wenn Sie zweimal aus derselben Urne ziehen, dann können Sie dabei zweimal denselben Zettel bekommen. Um das zu vermeiden, arbeiten Sie mit nur einer Urne, die alle nötigen Kombinationen enthält.


===== Urnen für Teilgruppen I =====

Es kann vorkommen, dass Sie die Gleichverteilung von Experimentalgruppen in zwei Teilgruppen gewährleisten müssen -- also z.B. wenn Sie 3 Stimuli haben und sowohl die Frauen als auch die Männer in der Studie gleichmäßig auf alle drei Konditionen verteilt werden sollen.

Hierfür benötigen Sie eine interne Variable und zwei (inhaltlich gleiche) Urnen. Das folgende Beispiel geht davon aus, dass das Geschlecht auf einer früheren Seite mit der Auswahlfrage SD02 abgefragt wurde. Und dass Sie zwei Urnen mit den Kennungen "frauen" und "maenner" angelegt haben, welche beide die Zahlen 1 bis 3 (jeweils in eigenen Zeilen) enthalten.

<code php>
if (value('SD02') == 1) {
  urnDraw('frauen', 'IV01', 'end');
} else {
  urnDraw('maenner', 'IV01', 'end');
}

// Stimulus anzeigen
$z = value('IV01_01');
if ($z == 1) {
  text('stimulus1');
} elseif ($z == 2) {
  text('stimulus2');
} elseif ($z == 3) {
  text('stimulus3');
}
</code>

Sie möchten lieber einen Zufallsgenerator anstatt einer Urne verwenden? Immerhin ist dieser einfacher anzulegen und zu verwalten... Dann sollten Sie, damit es bei der Anzeige des Stimulus nicht zu kompliziert wird, den gezogenen Code allerdings mittels ''[[:de:create:functions:put]]' in eine interne Variable umkopieren.

Der folgende PHP-Code geht davon aus, dass Sie 2 Teilgruppen haben (Frauen und Männer, entsprechend Variable "SD02"), für jede Gruppe einen Zufallsgenerator ("RG01" und "RG02") und außerdem eine [[:de:create:questions:internal|interne Variable]] mit der Kennung "IV01_01" angelegt haben.

<code php>
if (value('SD02') == 1) {
  question('RG01');  // Zufallsgenerator für Frauen
  put('IV01_01', value('RG01'));  // Umkopieren nach IV01_01
} else {
  question('RG02');  // Zufallsgenerator für Männer
  put('IV01_01', value('RG02'));  // Umkopieren nach IV01_01
}

// Stimulus anzeigen
$z = value('IV01_01');
if ($z == 1) {
  text('stimulus1');
} elseif ($z == 2) {
  text('stimulus2');
} elseif ($z == 3) {
  text('stimulus3');
}
</code>


===== Urnen für Teilgruppen II =====

Womöglich sollen die unterschiedlichen Teilpopluationen (z.B. Männer und Frauen) auch unterschiedliche Stimuli erhalten. Eine einfache Lösung besteht darin, dass Sie unterschiedliche Nummern in die Urnen legen.

Für das folgende Beispiel benötigen Sie eine Frage "interne Variablen" IV01 mit einem Item und zwei Urnen mit den Kennungen "frauen" (Nummern 1 bis 3, jeweils in einer eigenen Zeile) und "maenner" (Nummern 4 bis 6). Außerdem muss das Geschlecht bereits vorab mit Auswahlfrage SD02 abgefragt worden sein.

Ansonsten ist der PHP-Code weitgehend identisch mit dem vorhergehenden Beispiel.

<code php>
if (value('SD02') == 1) {
  urnDraw('frauen', 'IV01', 'end');
} else {
  urnDraw('maenner', 'IV01', 'end');
}

// Stimulus anzeigen
$z = value('IV01_01');
if ($z == 1) {
  text('stimulusF1');
} elseif ($z == 2) {
  text('stimulusF2');
} elseif ($z == 3) {
  text('stimulusF3');
} elseif ($z == 4) {
  text('stimulusM1');
} elseif ($z == 5) {
  text('stimulusM2');
} elseif ($z == 6) {
  text('stimulusM3');
}
</code>