Soluzione 1
Una soluzione semplice potrebbe essere, come dice Mursey, quella di generare un numero da 1 a 9 (non capisco perchè lo generi utilizzando l'elemento della matrice in posizione i,j, che oltretutto non setti), che utilizzerai come indice della matrice.
Poi estrai l'indice della riga e l'indice della colonna. La tua matrice altro non è che un'insieme di celle affiancate. Quindi per ipotesi, se il numero generato è 4 la posizione della matrice sarà:
4 / 3 = 1 riga
(4%3)-1 = 1 colonna
1/1 = 1 riga
1%1 = 0 colonna
5/3 = 1 riga
(5%3)-1 = 1 colonna
La sottrazione di una unità la fai solo se la colonna è diversa da 0.
Dovrebbe funzionare.
Soluzione 2
Generi riga e colonna separatamente, ma l'indice sarà da 1 a 3.
Soluzione 3
Crei un array con gli elementi da 1 a 9 generati random (per essere sicuro di non ripeterli ed evitare controlli, potresti inserirli linearmente e poi utilizzare un algoritmo per mischiarli
Shuffle array in C - Stack Overflow ). Ora dovrai solo accedere all'array per ottenere il singolo elemento (puoi usare ad esempio una variabile globale che tiene traccia dell'indice usato in precedenza).
Queste sono tutte soluzioni semplici, e ce ne saranno altre. In tutti i casi però tieni presente che gli indici che estrai potresti già averli utilizzati... di conseguenza se la cella non è vuota, devi generarne un altro.