int included_p(const int *ary, int num, int val)
{
  int i;
  for (i = 0; i < num; ++i) {
    if (val == ary[i]) return 1;
  }
  return 0;
}


for (i = 0; i < N; i++) {
  do {
    a[i] = i_random(n);
  } while (included_p(a, i, a[i]));
}

ただし、乱数に偏りがあると遅くなる危険性はある。

もしnがNに比べてそう大きくないなら、
>>463のやり方でn個の乱数列を作ってからN個取り出すとか。