一度ファイル全体を fgetsで取り込みながら ftellで現在のファイルポインタの位置を int型の配列に記録しておいて
その配列を元に 乱数による行選択から fseekを使えばいいのでは …
int nOffset[32768] = {0}, n = 0, m;
char sbuf[256];
FILE fp = NULL;
if ( NULL != ( fp = fopen( "sample.txt", "rt" ) ) ) {
n = 0;
do {
nOffset[n] = ftell( fp );
n++;
} while ( n < 32768 && NULL != fgets( sbuf, sizeof( sbuf ), fp ) );
fclose(fp);
}
fp = fopen( "sample.txt", "rt" );
m = rand() % 32768;
// nOffsetに各行のファイル先頭からのシーク量が記憶されている
fseek( fp, nOffset[m], SEEK_SET );
fgets( sbuf, sizeof( sbuf ), fp );
printf( "%s", sbuf );
fclose( fp );
何行分のデータが必要なのかなどは適宜修正してください