解法:
初學者通常會直接想到,隨機產生1~N的亂數並將之存入陣列中,後來產生的亂數存入陣列前必須先檢查陣列中是否已有重複的數字,如果有這個數字就不存入,在重新產生下一個數。運氣不好的話,重複的次數就會很多,程式的執行速度就很慢了,這不是一個好辦法。
以1~52的亂數排列為例好了,可以將陣列先依序由1到52填入,然後使用一個迴圈走訪陣列,並隨機產生1~52的亂數,將產生的亂數當作索引取出陣列值,並與目前陣列走訪到的值相交換,就不用擔心亂數重複的問題了,陣列走訪完畢後,所有的數字也就重新排列了。
以撲克牌為例,如何判斷花色?這是除法問題。求商數判斷花色,求餘數判斷數字。
自己寫的,一開始是打算寫成一個適用性比較強的亂數排序例子,可是又要兼顧撲克牌的特點。所以函數的起名已經參數設計的並不是太合理。
/* *內容: 洗撲克牌 (亂數排序) *時間: 2/13/2013 */ #include <stdio.h>#include <stdlib.h>#include <time.h> #define MAX 52 void initNumber(int array[], int arrayLength)//初始化數組 { for (int i = 1; i < arrayLength; ++i) {array[i] = i; } } void randomSort(int array[], int minValue, int maxValue)//將數組進行亂數排序 { srand(time(0)); int temp = 0; int num = 0; for (int i = 1; i < maxValue; ++i) { num = rand()%(maxValue-minValue+1) + minValue;//產生該範圍的隨機數 temp = array[i]; array[i] = array[num]; array[num] = temp; } } void printResult(int array[], int arrayLength) { int op = 0;//用來儲存 花色 int number = 0;//用來儲存 數字 for (int i = 1; i < arrayLength; ++i) { op = (array[i]-1) /13;//對花色進行判斷 switch (op){case 0 : printf ("\t紅心"); break;case 1 : printf ("\t方塊"); break;case 2 : printf ("\t梅花"); break;case 3 : printf ("\t黑桃"); break;default: break;}number = array[i]%13;//對數字進行判斷 switch (number){case 11 : printf (" J"); break;case 12 : printf (" Q"); break;case 0 : printf (" K"); break;default : printf ("%2d ", number); break;}if ( (i%4) == 0)//換行 {printf ("\n");} } printf ("\n\n"); } int main(){int number[MAX+1] = {0};//建立撲克牌initNumber(number, MAX+1);//初始化撲克牌 因為撲克牌沒有0,為方便,故將數組長度+1 randomSort(number, 1, MAX); //將撲克牌進行排序 printResult(number, MAX+1);return 1;}