洗牌演算法的研究

2021-06-03 17:53:04 字數 885 閱讀 1883

在紙牌遊戲中,有個發牌過程,發牌就是把紙牌序列打亂發給遊戲者。要保證發牌是隨機的,這也符合現實中玩牌的過程,「洗牌」。

洗牌:即產生指定資料的隨機序列,將牌序打亂。

方法一:

思路:將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 ...