0 votes
in SoSci Survey (dt.) by s089051 (245 points)

Ich habe nun folgenden PHP-Code:

Allerdings kommt es trotzdem vor, dass manche Seiten (Gemälde vom gleichen Künstler) direkt hintereinander dargeboten werden.

$kuenstler = [
  'AG01' => 1, // Alexej von Jawlensky
  'AG02' => 2, // Arthur Dove
  'AG03' => 3, // Hilma af Klimt
  'AG04' => 4, // Marsden Hartley
  'AG05' => 5, // Paul Klee
  'AG06' => 6, // Theo Van Doesburg
  'AG07' => 7, // Dixon
  'AG08' => 8, // Schwitters
  'AG09' => 9, // Archile Gorky
  'AG10' => 10, // Maletwitsch
  'AG11' => 10, // Malewitsch
  'AG12' => 11, // Michail Matjuschin
  'AG13' => 12, // Ola Rosanova
  'AG14' => 5, // Paul Klee
  'AG15' => 5, // Paul Klee
  'AG16' => 5, // Paul Klee
  'AG17' => 5, // Paul Klee
  'AG18' => 5, // Paul Klee
  'AG19' => 13, // Moholy
  'AG20' => 13, // Moholy
  'AG21' => 13, // Moholy
  'AG22' => 13, // Moholy
  'AG23' => 13, // Mondrian
  'AG24' => 14, // Mondrian
  'AG25' => 14, // Mondrian
  'AG26' => 14, // Mondrian
  'AG27' => 14, // Mondrian
  'AG28' => 12, // Olga Rosanova
  'AG29' => 15, // Chashnik
  'AG30' => 15, // Chashnik
  'AG31' => 15, // Chashnik
  'AG32' => 16, // Kliun
  'AG33' => 16, // Kliun
  'AG34' => 17, // Otto Freundlich
  'AG35' => 18, // Amadeo de Souza Cardoso
];
$seiten = array_keys($kuenstler);
shuffle($seiten);
$lastOne = -1;
$double = false;
foreach ($seiten as $seite) {
  if ($kuenstler[$seite] == $lastOne) {
    $double = true;
  }} 
$seiten[] = 'AG FAKE';
setPageOrder($seiten);

Wie baue ich nun eine Schleife ein, die so lange probiert, bis eine Kombination vorliegt, in welcher Jeder Künstler direkt von einem unterschiedlichen gefolgt wird? Vielen Dank!:)

1 Answer

0 votes
by SoSci Survey (306k points)

Im Moment prüfen Sie nur (Variable $double), ob eine Wiederholung vorkommt. Sie tun aber noch nichts dagegenen. Mit folgender Modifikation wird neu gemischt:

$kuenstler = [
  'AG01' => 1, // Alexej von Jawlensky
  'AG02' => 2, // Arthur Dove
  'AG03' => 3, // Hilma af Klimt
  'AG04' => 4, // Marsden Hartley
  'AG05' => 5, // Paul Klee
  'AG06' => 6, // Theo Van Doesburg
  'AG07' => 7, // Dixon
  'AG08' => 8, // Schwitters
  'AG09' => 9, // Archile Gorky
  'AG10' => 10, // Maletwitsch
  'AG11' => 10, // Malewitsch
  'AG12' => 11, // Michail Matjuschin
  'AG13' => 12, // Ola Rosanova
  'AG14' => 5, // Paul Klee
  'AG15' => 5, // Paul Klee
  'AG16' => 5, // Paul Klee
  'AG17' => 5, // Paul Klee
  'AG18' => 5, // Paul Klee
  'AG19' => 13, // Moholy
  'AG20' => 13, // Moholy
  'AG21' => 13, // Moholy
  'AG22' => 13, // Moholy
  'AG23' => 13, // Mondrian
  'AG24' => 14, // Mondrian
  'AG25' => 14, // Mondrian
  'AG26' => 14, // Mondrian
  'AG27' => 14, // Mondrian
  'AG28' => 12, // Olga Rosanova
  'AG29' => 15, // Chashnik
  'AG30' => 15, // Chashnik
  'AG31' => 15, // Chashnik
  'AG32' => 16, // Kliun
  'AG33' => 16, // Kliun
  'AG34' => 17, // Otto Freundlich
  'AG35' => 18, // Amadeo de Souza Cardoso
];
$seiten = array_keys($kuenstler);

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

$seiten[] = 'AG FAKE';
setPageOrder($seiten);

Das ist aber relativ ineffizient, weil viele zufällige Abfolgen ausprobiert werden müssen, bevor eine passt. Die Wahrscheinlichkeit für eine Wiederholung ist doch relativ hoch.

Sollte es bei einzelnen Versuchen zu einem längerne "Hänger" kommen, müssten wir etwas effizienteres finden. Konkret würde man bei einer Wiederholung diesen Künstler mit einer zufälligen anderen Position tauschen.

by s089051 (245 points)
Was bedeutet "die Wahrscheinlichkeit" ist relativ hoch? Nimmt der Befehl nicht erst eine Reihenfolge an, wenn die Bedingung einer Nichtwiederholung erfüllt ist?

Also bis jetzt gab es bei den Probeversuchen noch keinen "Hänger".
Ich habe Ihren Code kopiert und es scheint zu funktionieren. Ich habe allerdings auch nur manuell geprüft, ob es Wiederholungen gibt....
by SoSci Survey (306k points)
> Nimmt der Befehl nicht erst eine Reihenfolge an, wenn die Bedingung einer Nichtwiederholung erfüllt ist?

Doch ... aber bis dahin muss der Code u.U. einige hundert Reihenfolgen durchprobieren. Das sollte nicht lange dauern, deshalb habe ich diese Lösung empfohlen. Wäre die Wahrschienlich noch höher (z.B. wenn nur 1 von 1000 Kombinationen Wiederholungsfrei wäre), dann hätte ich eine andere Lösung empfohlen.
by s089051 (245 points)
OK, das bedeutet ich kann diesen Code verwenden, sollte aber darauf achten, ob solche "Hänger" bei der Erhebung auftauchen. Wie stelle ich diese fest?
by SoSci Survey (306k points)
Indem Sie fleißig testen :) Wie gesagt: Ich rechne im vorliegenden Fall nicht damit. Wenn Sie es genau wissen möchten, müssten sie die Wahrscheinlichkeit für eine Künstler-Wiederholung in einer zufälligen Reihenfolge berechnen und dann die Wahrscheinlichkeit, dass in z.B. 5000 aufeinanderfolgenden Ziehungen eine Abfolge mit Wiederholung gewürfelt wird.

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

...