實現乙個方法,對一副牌(52張)進行洗牌,要求洗出的52!組合是的等概率的,即每種組合的概率為1/52!,假設已經有乙個完美的隨機數生成器。
思路:思路比較直觀,第一次從52張牌中隨機取一張出來,概率為1/52;第二次從剩下的51張隨機取一張出來,概率為1/51;以此類推最終的概率就是1/52!。接下來是如何用**實現,當選中一張牌之後,在下次選擇的時候就不能讓這張牌再參與選擇,這個怎麼實現。
我們先假設一副牌數為5的牌:1,2,3,4,5。如果第1次隨機取到的數是4, 那麼我們希望參與第2次隨機選取的只有1,2,3,5。既然4已經不用, 我們可以把它和1交換,第2次就只需要從後面4位(2,3,1,5)中隨機選取即可。同理, 第2次隨機選取的元素和陣列中第2個元素交換,然後再從後面3個元素中隨機選取元素,以此類推。
#include #include using namespace std;
void swap(int& a, int& b)
void randomshuffle(vector& ivec)
}int main()
每日演算法 洗牌演算法
給定乙個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 ...