//genscore.c -- @CopyLeft by tsaiwn@csie.nctu.edu.tw #define FILE_NAME "studat.txt" #define ID_BASE 9917001 #include #include #include #include char nameLast[ ][3]={"趙", "錢", "孫", "李", "陳", "林", "陳", "林", "吳", "魏", "王", "蔡", "章", "張","簡", "馬","蘇" }; //陳林 2 倍機會 const int N_LAST = (sizeof nameLast / sizeof(nameLast[0]) ); #define NSTU_MIN 81357 #define NSTU_VAR 200 #define NSTU_MAX (NSTU_MIN + NSTU_VAR) int myRand( ) { int ans = rand( ) % 100; // 不好, 因 uniform distribution// 0..99 if(ans < 50) ans += 66; // 太低就加 66 分 return ans % 100; // ensure 0..99, 若還變成很低就不管囉! } void genName(char*p) { char mm, m2, m3; char tmps[8]={0}; *p = 0; // 清除字串; 其實是讓字串一開始就結束 strcat(p, nameLast[rand( )% N_LAST]); mm = 'A' + rand( )%26; m2 = 'A' + rand( )%26; m3 = 'a' + rand( )%26; sprintf(tmps, "%c%c%c", mm, m2, m3); strcat(p, tmps); // 把 tmps 串接到字串 p 尾巴 ! } extern int nStudent; long genID( ) { static char idFlag[NSTU_MAX + 1]; int k = rand( ) % nStudent; // 一開始用亂數決定 int nTry = 0; while(idFlag[k] !=0) { k = rand( ) % nStudent; if(++nTry > 10) break; // 試10次就放棄.. } //.. 然後改用由開始往後慢慢找沒有用過的 if(idFlag[k]!=0) { // k 已經用過 k=0; while(idFlag[k] !=0) ++k; // 逐一慢慢找沒有用過的 } idFlag[k] = 1; // 找到了, 就用 k, 並標示為用過了 return ID_BASE + k; } /// int nStudent; long sid; char name[9]; int hwk, mid, quiz, fin; // homework, midterm, quiz, final exam void getNextStuData( ) { sid = genID( ); genName(name); hwk = myRand( ); mid = myRand( ); quiz = myRand( ); fin = myRand( ); } int main( ) { FILE* fp; // file pointer for Open a data file int i; printf(" wait..."); srand( time(0) ); // randomize so that looks like TRUE Random ! int n = NSTU_MIN + rand( ) % NSTU_VAR; // 每次 run 人數不同 nStudent = n; fp = fopen(FILE_NAME, "wt"); // Open, for write, text if(fp==0){fprintf(stderr,"?open %s error...\n",FILE_NAME); return 1; } for(i = 1; i<= n; ++i) { getNextStuData( ); fprintf(fp, "%7d %9s %3d %3d %3d %3d\n", sid, name, hwk, mid, quiz, fin); }fclose(fp); fprintf(stderr, "File %s generated successfully.\n", FILE_NAME); fprintf(stderr, "Total %d student records.\n", n); return 0; }