在紙牌遊戲中,有個發牌過程,發牌就是把紙牌序列打亂發給遊戲者。要保證發牌是隨機的,這也符合現實中玩牌的過程,「洗牌」。
洗牌:即產生指定資料的隨機序列,將牌序打亂。
方法一:
思路:將n個數依次放到隨機的位置。關鍵是每次找乙個隨機的位置。
1、設定目標陣列為空(置0)
1、每次產生乙個0~n-1的隨機數,看這個位置是否已經放置了數,如果已經放置了,則繼續用同樣的方法找乙個隨機位置判斷;如果這個位置還未放置,則設定此位置
3、反覆執行(2)直到所有的位置都放置了數為止。(只要設定成功n次數就說明所有位置已經設定了數)
注:另外的理解就是,牌一張一張的發,從n張牌中隨便選一張,發第一張,第二張。。。。。。一直到 第n張。
**:
void shuffle(int dest,int n) //n為牌的個數
while(dest[pos]!=0); //如果已經放置牌,隨機產生下乙個位置,繼續放置"牌"
dest[pos]=card;
}
}
上面方法的問題:隨著未設定的數漸漸變少,尋找未設定的位置會越來越難。如果牌數很多演算法效率越來越低。
優點:演算法過程思路比較簡單,符合正常思維。
方法二:
思路:目標陣列,是牌的順序是有序的,打亂它的次序,我們可以通過交換陣列中任意兩個位置的牌,一定次數的交換可使牌序打亂。
void shuffle ( int a, int n ) //洗牌演算法
}
此方法較第一次效率較高,不需遍歷所以牌。
每日演算法 洗牌演算法
給定乙個n個數的序列,設計乙個演算法將其隨機打亂,保證每個數出現在任意乙個位置的概率相同 也就是說在n 個的排列中,每乙個排列出現的概率相同 假設輸入為陣列num length 隨機選乙個數,放到num 0 中,再隨機選數,如果該數已經選過,重新選,直到該數未選過時放入num 1 中,以此類推,直到...
洗牌演算法小結
1.for i 1 to n do swap a i a random 1,n 湊合,但不是真正隨機 2.for i 1 to n do swap a i a random i,n 真正的隨機演算法 其中,random a,b 函式用於返回乙個從a到b 包括a和b 的隨機整數。第乙個 概率事件總的發...
隨機洗牌演算法
問題 給定乙個有序序列1 n,要你將其完全打亂,要求每個元素在任何乙個位置出現的概率均為1 n。解決方案 依次遍歷陣列,對第n個元素,以1 n的概率與前n個元素中的某個元素互換位置,最後生成的序列即滿足要求,1 n的概率可通過rand n實現。見如下程式 void swap int p,int q ...