Ja, das ist nicht ganz trivial...
Was Sie brauchen, sind drei Listen (Arrays) für die 3 Kategorien. Die mischen Sie mittels shuffle(). Und dann bauen Sie einfach nach dem gewünschten Schema zusammen:
// Die Bilder definieren wir mal separat und weisen ihnen Nummern zu. Ist einfacher
$bilder = [
  1 => 'bild.N1.jpg',
  // ...
  16 => 'bild.N16.jpg',
  21 => 'bild.P1.jpg',
  // ...
  28 => 'bild.P8.jpg',
  31 => 'bild.N1.jpg',
  // ...
  38 => 'bild.N8.jpg'
];
// Die Abfolge definieren wir nur einmal
if (isset($abfolge)) {
  $neutral = [1,2,3, ... 16];
  $positiv = [21,22,23, ... 28];
  $negativ = [31,32,33, ... 38];
  shuffle($neutral);
  shuffle($positiv);
  shuffle($negativ);
  // Jetzt das Zusammenbauen: 8 mal dasselbe Schema
  $abfolge = [];
  for ($i=0; $i<8; $i++) {
    $abfolge[] = $positiv[$i];
    $abfolge[] = $neutral[2*$i];  // Ergibt die Indizes 0, 2, 4, 6, ..., 14
    $abfolge[] = $negativ[$i];
    $abfolge[] = $neutral[2*$i + 1];  // Ergibt die Indizes 1, 3, 5, 7, ..., 15
  }
  registerVariable($abfolge)
}
// Jetzt noch anzeigen
$bildID = loopPage($abfolge);
$bildName = $bilder[$bildID];
html('<div><img src="'.$bildName.'" alt=""></div>');
Und falls Sie zu den Bildern noch Fragen zeigen möchten: Anhand der $bildID ist das ganz einfach möglich. Mit putList() können Sie die verwendete Abfolge auch bequem abspeichern.
Update: Ich nahm Ihre Frage zum Anlass, derartige Rotationen (und den Code hier im speziellen) etwas ausführlicher in der Anleitung zu erklären: Komplexe Rotationen