rand()を使って、重なりを出さずに、1~40の配列を40作る一例です。
この方法は、最初に1~40の数字の配列を作成しておいて、
ランダムにその中から数字を選び、選ばれた数字をその配列から削除し、
残った数字の中からランダムに選び.....を繰り返すやり方です。
ほかにも色々なやり方がありますが、何か参考になれば、幸いです。
char buf[40][40];
char chk[40];
char now[40];
int n, i, k, cnt, rdt;
for( n=0; n<40; ){
for( i=0; i<40; i++ ){
chk[i] = i+1; //取り出しテーブルの作成
}
for( cnt=0,k=40; k>1; ){
do{
rdt = rand() % k;
}while( rdt < 0 ); //取り出し位置の取得
now[cnt++] = chk[rdt]; //選択データの保存
k--;
while( rdt < k ){ //選択データを外すループ
chk[rdt] = chk[rdt+1];
rdt++;
}
}
for( i=0; i<n; i++ ){
if( memcmp( buf[i], now, 40 ) == 0 ){//作成した配列のチェック
break;
}
}
if( i==n ){
memcpy( buf[n], now, 40 ); //乱数配列の登録
n++;
}
}