OK, ein 4x4 int-Array hat logischerweise 16 int-Felder. Da die Zufallszahlen im Intervall [0, 15] liegen, muss jede dieser Zahlen genau einmal vorkommen! Es sind ja eben 16 Ganzzahlen in dem Interval.
Daher durchläufst du nicht das Array von [0][0] nach [3][3] und guckst ob die Zufallszahl schon drin ist, SONDERN ...
du machst eine for-Schleife mit i von 0 bis 15, welche die "Zufallszahlen" darstellen. Die werden jetzt nicht zufällig generiert, sondern schön nacheinander im Array gespeichert. Und damit das Ganze einen gewissen Zufall behält, speicherst du arr[rand()%4][rand()%4] = i; falls dieses Feld noch NULL also noch nicht belegt ist.
Verständlich so, oder soll ich das schnell coden?