¿Es correcta esta implementación de C de Fisher-Yates shuffle?

Aquí hay una implementación en C de Fisher-Yates que quiero usar en una rutina de barajar baraja. ¿Estoy haciendo esto correctamente (n = longitud de la matriz)?

Nota: El ciclo do-while intenta corregir el sesgo del módulo (veraquí) Agrega un poco de sobrecarga al procedimiento y podría eliminarse si no le importa el sesgo de bits bajos.

void shuffle(int *array, int n) {

  int i, j, tmp, upper_bound;

  srand(time(NULL));

  for (i = n - 1; i > 0; i--) {

    upper_bound = RAND_MAX - ((RAND_MAX % (i + 1)) + 1);

    do {
      j = rand() % (i + 1);
    } while (j > upper_bound);

    tmp = array[j];
    array[j] = array[i];
    array[i] = tmp;   
  }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta